介绍了一个使用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时,程序终止。
下面是程序思路流程图:
算法流程图
3、运行结果
设置字符串str和匹配字符串substr如图:
字符串设置
运行结果如下:
仿真结果
本实验的汇编语言源代码见博客末尾:
- ;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
复制代码 |