在看KSSD中的某一章节中,有如下的代码:
实现(2)编写程序,比较两个字符串是否相同,并输出比较结果。
DATA SEGMENT
STRING1 DB "AnyThing is possible." ;定义字符串1
STRING2 DB "Anything is possible." ;定义字符串2
MESS1 DB "Matched",13,10,'$'
MESS2 DB "No Matched",13,10,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
PUSH DS ;DX入栈
XOR AX,AX ;AX清零
PUSH AX ;AX入栈
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,STRING1 ;设置源串地址
LEA DI,STRING2 ;设置目标串地址
CLD ;设置操作方向DF,从低地址到高地址进行搜索
MOV CX,21 ;设置比较字符串的长度,也是循环的长度。
REPZ CMPSB ;用该命令前,要先设置好DS:[SI] ,ES:[DI]
JZ MATCH ;比较字符串是否相等,相等则跳到MATCH,不相等则顺序执行。
LEA DX,MESS2 ;显示字符串为Unmatched
JMP DISP
MATCH: LEA DX,MESS1 ;比较结束后,全部相同显示MESS1,Matched
DISP:
POP AX ;这段代码是我加的,加了后就不能正确显示结果了
POP DS ;这段代码是我加的,加了后就不能正确显示结果了
MOV AH,09H
INT 21H ;显示字符串"Matched",或者是"Unmatched"
ENDS
END START
有点疑惑就是:
1,数据定义时MESS1 DB "Matched",13,10,'$' 中的13,10分别用来做什么用的?
2,代码中为什么要
PUSH DS ;DX入栈
PUSH AX ;AX入栈
3,如果我在代码的最后改成
DISP:
POP AX
POP DS
MOV AH,09H
INT 21H ;显示字符串"Matched",或者是"Unmatched"
那么结果会完全不同,不明白为什么,请教了!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)