介绍了一个使用x86指令集的汇编语言仿真实验,实验具体要求和仿真结果如下:1、实验任务要求

2、设计思路
分析实验要求,我们要完成四个功能:
1)从一个已知字符串str中找到匹配字符串substr的起始位置;
2)从起始位置开始,比对两个字符串,确定两个字符串确实一样,由此便可认为已知字符串中出现了匹配字符串;
3)在找到匹配字符串后,设置标志为单元found;
4)在找到匹配字符串后,把匹配位置存放到pos中。
明确需要完成的功能,然后设计算法:
1)使用‘while’循环,遍历字符串str,找到匹配字符串substr的起始位置;
2)找到起始位置后,再用LOOP循环对两个字符串比对。循环次数是substr长度再减一(第一次已经在while中完成);
3)4)完成循环后,设置标志位found,把匹配位置存放到pos中。

注意到str可能不包含substr,当遍历str没有找到substr时,程序终止。
image.png

下面是程序思路流程图:

image.png

3、运行结果
设置字符串str和匹配字符串substr如图:

image.png

运行结果如下:

image.png

本实验的汇编语言源代码见博客末尾:

;Finding substr from string
  • DATA SEGMENT
  •     str DB '2020210827 Liqiwen', 00H
  •     substr DB 'Liqiwen', 00H
  •     N EQU $-substr
  •     found DB 00H
  •     pos DW ?
  • DATA ENDS
  • CODE SEGMENT
  •     ASSUME CS:CODE, DS:DATA
  • START:
  •     MOV AX, DATA
  •     MOV DS, AX
  •    
  •     LEA SI, str
  •     XOR AX, AX
  •     MOV AL, [SI]    ;Using AL as the container of [SI]
  •     XOR CX, CX
  •     MOV CX, N-1     ;LOOP times: N-1
  • BACK:LEA DI, substr
  • SHIFT:
  •     CMP AL, 00H     ;str doesn't contain substr, program terminated.
  •     JE FINISH
  •     CMP AL, [DI]
  •     JE COMP         ;If [SI] euqals the first chart of substr, comparation will begin.
  •     INC SI
  •     MOV AL, [SI]   
  •     JMP SHIFT
  • COMP:
  •     INC SI          ;Shift to the next chart
  •     INC DI
  •     MOV AL, [SI]
  • L1:
  •     CMP AL, [DI]
  •     JNE BACK        ;If [DI] doesn't euqal [SI], clarifying substr didn't appare, instruction will go back.
  •     INC SI
  •     INC DI
  •     MOV AL, [SI]
  •     LOOP L1
  •    
  •     MOV AL, 0FFH
  •     MOV found, AL
  •     LEA BX, SI-8    ;BX deposits the beginning position.
  •     MOV [pos], BX
  •      
  • FINISH:   
  •     MOV AH, 4CH
  •     INT 21H
  • CODE ENDS
  • END START
  • 复制代码