到目前为止,这是我的代码。出于某种原因,我总是在跑步时收到 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
由于程序中的一些错误,您的 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句