这样写对吗?
Is this writing correct?
我为了学习汇编语言而学习的一本书定义了下面的示例,将#符号更改为$符号。但是,当我在 emu8086 中尝试这个时,它不起作用。
当我点击模拟这段代码时,它显示了一个错误,如 (18) wrong parameters 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
盲目修复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" 指令族(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
通常,根据您的假设验证任何指令的最简单方法是输入 google“x86 <name_of_instruction>
”并查找一些域名,您会随着时间的推移识别出包含原始英特尔文档的转换进入 HTML。例如这个:http://x86.renejeschke.de/
我为了学习汇编语言而学习的一本书定义了下面的示例,将#符号更改为$符号。但是,当我在 emu8086 中尝试这个时,它不起作用。
当我点击模拟这段代码时,它显示了一个错误,如 (18) wrong parameters 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
盲目修复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" 指令族(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
通常,根据您的假设验证任何指令的最简单方法是输入 google“x86 <name_of_instruction>
”并查找一些域名,您会随着时间的推移识别出包含原始英特尔文档的转换进入 HTML。例如这个:http://x86.renejeschke.de/