我正在研究x86反汇编程序用于教育目的。我一直在使用nasm来组装不同的指令。
目前我正在研究具有ModR / M字节的16位寻址形式。 " Intel 64和IA-32架构软件开发人员手册:第2A卷指令集参考,A-M" (我认为我的版本已过时,但此信息仍应成立)说明"默认段寄存器为SS,用于包含BP索引的有效地址,DS用于其他有效地址"。
因此,如果我理解正确,以下说明应该完全相同:
mov [bx], eax
mov [ds:bx], eax
但是,当我使用nasm编译上述指令并查看生成的字节时,我得到以下内容:
67 89 07 mov [bx], eax
3e 67 89 07 mov [ds:bx], eax
我理解所有字节的含义,但我不明白为什么nasm会将ds段覆盖前缀(3e)添加到第二条指令。我似乎没有必要,因为ds已经是默认段。
我的问题是:我在这里遗漏了什么,或者不需要ds段覆盖前缀?
答案 0 :(得分:2)
如果您输入mov [ds:bx], eax
,汇编程序应汇编mov [ds:bx], eax
。 NASM不是(也不应该!)一个优化汇编器来纠正您的输入。也许您确实需要四个字节的空间来修改程序代码。