nasm 插入了冗余 DS 段覆盖前缀?
Redundant DS segment override prefix inserted by nasm?
我正在研究用于教育目的的 x86 反汇编程序。我一直在使用 nasm 来组装不同的指令。
目前我正在研究 ModR/M 字节的 16 位寻址形式。 "Intel 64 and IA-32 Architectures Software Developers Manual: Volume 2A Instruction Set Reference, A-M"(我认为我的版本已过时,但此信息应该仍然适用)指出 "The default segment register is SS for the effective addresses containing a BP index, DS for other effective addresses".
因此,如果我理解正确,则以下说明应该完全相同:
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 段覆盖前缀?
如果您输入 mov [ds:bx], eax
,assembler 应该 assemble mov [ds:bx], eax
。 NASM 不是(也不应该!)优化 assembler 来纠正您的输入。也许您恰好需要 space 四个字节来修改程序代码。
我正在研究用于教育目的的 x86 反汇编程序。我一直在使用 nasm 来组装不同的指令。
目前我正在研究 ModR/M 字节的 16 位寻址形式。 "Intel 64 and IA-32 Architectures Software Developers Manual: Volume 2A Instruction Set Reference, A-M"(我认为我的版本已过时,但此信息应该仍然适用)指出 "The default segment register is SS for the effective addresses containing a BP index, DS for other effective addresses".
因此,如果我理解正确,则以下说明应该完全相同:
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 段覆盖前缀?
如果您输入 mov [ds:bx], eax
,assembler 应该 assemble mov [ds:bx], eax
。 NASM 不是(也不应该!)优化 assembler 来纠正您的输入。也许您恰好需要 space 四个字节来修改程序代码。