盲目尝试修复代码emu8086:
.MODEL SMALL
.STACK 64
.DATA
DIZI DB 'LDA#305A'
.CODE
ANA PROC FAR
MOV AX, @DATA
MOV ES, AX ; es for SCASB
CLD
MOV AL, '#'
MOV BH, '$'
MOV CX, 9
LEA DI, [DIZI]
REPNE SCASB ; should now work over correct ES:DI memory.
JNE CIK
MOV [ES:DI-1], BH ; try ES:[DI-1] in case of syntax err.
; ^^ needs now "ES:" prefix, because I don't set "DS"
CIK: MOV AH, 4CH
INT 21H
ANA ENDP
END ANA
另一种选择是同时设置ds
和es
,像这样:
ANA PROC FAR
MOV AX, @DATA
MOV DS, AX ; ds for default memory access
MOV ES, AX ; es for SCASB
...
... then modifying the char can be done without "ES:" prefix, using default "DS:"
JNE CIK
MOV [DI-1], BH
...
而且阅读很重要您使用的指示的详细说明。例如,SCASB非常特殊,它固定为ES:DI
内存指针,并且不能被任何段前缀覆盖(与80%其他指令相反,其可以从默认DS/SS加到其他任何指令的前缀)。
的“弦”按照压家庭(其中SCASB所属)是特别棘手,因为源指针DS:SI可以被覆盖,即:
MOVSB ; moves single byte from [DS:SI] to [ES:DI], ++SI, ++DI
SS:MOVSB ; moves single byte [SS:SI] to [ES:DI], ++SI, ++DI
通常以验证对你的假设的任何指令的最简单方法是要进入谷歌“x86 <name_of_instruction>
”,并寻找一些域名,你会认识到随着时间的推移将原始的英特尔文档转换成HTML。像这样的例子:http://x86.renejeschke.de/
请扩大“它不工作”。 –
删除“DS:”,只留下DI。 –
@Jose Manuel AbarcaRodríguez它仍然以这种方式在字符串中显示#符号。 – NoWeDoR