我学习汇编语言的一本书定义了下面的例子,将#符号改为$符号。但是,当我在emu8086中尝试这个时,它不起作用。
当我点击模拟此代码时,它显示错误,如(18)错误参数LEA [DI],DIZI
有什么问题?
.MODEL SMALL
.STACK 64
.DATA
DIZI DB 'LDA#305A'
.CODE
ANA PROC FAR
MOV AX, @DATA
MOV DS, AX
CLD
MOV AL, '#'
MOV BH, '$'
MOV CX, 9
LEA DS:DI, DIZI
REPNE SCASB
JNE CIK
MOV BYTE PTR[DI-1], BH
CIK: MOV AH, 4CH
INT 21H
ANA ENDP
END ANA
答案 0 :(得分:1)
盲目尝试修复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加到任何其他指令) )。
“string”intruction系列(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/