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 四个字节来修改程序代码。