x86 ASM div dividend寄存器占用

x86 ASM div dividend register occupation

对于 x86 div 操作,有人可以帮助理解为什么当 operand/dividend 大小是双字时不使用 EAX 寄存器,而不是将它们拆分为 DX:AX 寄存器?

此处给出:https://c9x.me/x86/html/file_module_x86_id_72.html

跟标志有关系吗?

谢谢!

这是历史性的。这就是 16 位 8086 所做的,因为它没有 32 位寄存器。当 32 位 80386 被引入时,它的主要“特性”之一是与 8086 的向后兼容性:它可以 运行 在其“真实”或“虚拟 8086”模式下的 8086 代码。

因此 80386 CPU 必须支持一条指令,该指令对两个 16 位寄存器中的被除数进行 32 位除法,以用于 real/v86 模式。因此它还不如在 32 位保护模式下使用相同的行为,而不是使用更多的晶体管来实现替代形式。无论如何,在 386 和 8086 之间尽可能多地相似是英特尔理念的一部分,即使这会导致一些尴尬的选择,而这些选择对于通用的 32 位机器来说是没有意义的。 (35 年后,我们仍在为其中的许多选择买单。)

在 32 位或 64 位模式下,您可能更愿意将 32 位除数放入 eax,将 edx 置零,然后执行 64 ->32 位 div(quadword/doubleword 操作数大小)。这也允许您使用完整的 32 位作为结果,这样就不会溢出;而对于 32->16 位 div,如果结果不适合 16 位,您将得到一个异常。