【问题标题】:x86 ASM div dividend register occupationx86 ASM div 分红寄存器占用
【发布时间】:2020-12-03 11:56:36
【问题描述】:

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

这里给出:https://c9x.me/x86/html/file_module_x86_id_72.html

跟标志有关系吗?

谢谢!

【问题讨论】:

  • dword 操作数大小 (div r/m32) 是 EDX:EAX / src => EDX 和 EAX 结果。 DX:AX 将是字操作数大小。 (被除数是操作数大小的两倍。)

标签: assembly x86-64


【解决方案1】:

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

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

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

【讨论】:

  • 我想这也是为什么 Apple 的 arm 比 x86 具有如此优势的设计选择原因之一? (只是业余猜测)
  • @Alterecho 不是,不是。主要原因是他们在资金上降低了流程,并设计了具有大量执行单元和广泛前端的设计。英特尔可以做更多的工作。
  • @fuz 哦,是的,我也忘记了这个过程。 14nm 与 M1 的 5nm。硅上统一内存 RAM!与快速 SSD 的快速交换!我认为 AMD 非常接近带有智能存取内存技术的 UMA 架构的想法!
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2012-02-17
  • 2019-01-02
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2014-07-06
  • 2023-03-11
相关资源
最近更新 更多