【发布时间】:2018-06-06 22:59:52
【问题描述】:
代码必须输出'ccb',但只输出'c',LOOP只做一次,我在TD里校准过,为什么LOOP只做一次?
我认为我必须减少 STRING_LENGTH,所以我写了
DEC STRING_LENGTH
但它不起作用,所以我是这样写的
MOV SP,STRING_LENGTH
DEC SP
MOV STRING_LENGTH,SP
我知道你现在在想什么,这太不正确了,你是对的)))
我可以使用 C++,但我只想在汇编中使用,
DOSSEG
.MODEL SMALL
.STACK 200H
.DATA
STRING DB 'cScbd$'
STRING_LENGTH EQU $-STRING
STRING1 DB STRING_LENGTH DUP (?) , '$'
.CODE
MOV AX,@DATA
MOV DS,AX
XOR SI,SI
XOR DI,DI
MOV CX,STRING_LENGTH
S:
MOV BL,STRING[DI]
AND STRING[DI],01111100B
CMP STRING[DI],01100000B
JNE L1
MOV AL,BL
MOV STRING1[SI],AL
ADD SI,2
L1:
ADD DI,2
LOOP S
MOV DL,STRING1
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
END
【问题讨论】:
-
更有可能你的循环没有按照你的想法做。您不会在循环中破坏 CX,因此它应该运行
STRING_LENGTH次。使用调试器单步执行并查看最终在内存中的结果。无论如何,您希望循环做什么?还有你为什么要毁掉原来的STRING? -
我用调试器单步执行,看到在 MOV CX,STRING-LENGTH //CX IS 0006 after LOOP S //CX IS 0000 但是为什么?
-
在 Turbo Debugger (TD.EXE) 中,“F8 步”将完全“执行”
loop指令(cx多次,或者更多,如果代码同时修改cx)。使用“F7 跟踪”选项从 cx=6 变为 cx=5。 (投赞成票是因为您正在尝试调试,在发布问题后继续沟通,并且 TD UI 在这种特殊情况下有些棘手,但除此之外您还有很多工作要做)。 -
在循环内部,当它写入 string1 时,它写入一个字节,但将 si 增加 2。
-
循环迭代 6 次,每次将 di 递增 2,因此它会超出输入字符串的末尾,并在执行过程中覆盖。