到目前为止,这是我的代码。出于某种原因,我总是在跑步时得到NOT FOUND消息 我必须检查主字符串(HELLO)中是否存在某个子字符串(HELL)。如何修复代码?
.model small
COMPARE MACRO
LEA DI,SUBSTR
MOV CL,LENSUB
CLD
REPE CMPSB
JZ FOUND
ENDM
.data
STR DB "HELLO"
LENSTR DB $-STR
SUBSTR DB "HELL"
LENSUB DB $-SUBSTR
MSG1 DB "FOUND$"
MSG2 DB "NOT FOUND$"
.code
MOV AX,@Data
MOV DS,AX
MOV CL,LENSTR
LEA SI,STR
UP:
PUSH SI
PUSH CX
COMPARE
POP CX
POP SI
INC SI
LOOP UP
LEA DX,MSG2
UP1:
MOV AH,09H
INT 21H
JMP LAST
FOUND:
LEA DX,MSG1
JMP UP1
LAST:
MOV AH,4CH
INT 21H
END
答案 0 :(得分:1)
由于程序中存在一些错误,您的COMPARE宏代码永远不会(?)跳转到FOUND:
您已设置DS段寄存器,但由于REPE CMPSB
指令也使用ES段寄存器,因此您仍需要设置该段寄存器。
MOV AX, @Data
MOV DS, AX
MOV ES, AX
REPE
前缀需要在CX寄存器中找到重复次数,但您只在CL寄存器中存储一个计数。
LEA DI, SUBSTR
MOV CL, LENSUB
MOV CH, 0
...
...
...
MOV CL, LENSTR
MOV CH, 0
LEA SI, STR
关于LOOP UP
指示!
由于子字符串只能在较大的字符串中出现次数有限,因此您无法循环显示较大字符串的总长度。正确的计数是 LENSTR-LENSUB + 1 。在这里你有5-4 + 1给2作为存储在CX中的正确值。
HELLO
HELL 1st is correct
ELLO 2nd is correct
LLO? 3rd is wrong
LO?? 4th is wrong
O??? 5th is wrong