【问题标题】:How mul instruction works in the case : 'mul mem'?mul 指令在这种情况下如何工作:'mul mem'?
【发布时间】:2015-10-14 11:38:48
【问题描述】:

我是 ASM 初学者,我知道 mul 指令只适用于寄存器或内存。

现在,当我们使用 :mul var1 时,如何检索 var1 的值?我认为它应该先通过注册,对吧?但是在这种情况下,如果所有寄存器都被占用会发生什么?

【问题讨论】:

  • @stuartd:我看过这篇文章,它只是说 mul 不适用于立即值。
  • 它不会“通过注册”。该值与将要乘以的任何值一起发送到 ALU,这取决于 var1 的位宽。但是请注意,这是无效的mul word 3,但是,如果您有 3 所在的 mem 的地址,您可以这样做 mul word [varThatEqualsThree] 获取英特尔手册,这里:Intel 64 and IA-32 Architectures Software Developer's...
  • add eax, [mem] 的工作方式相同... x86 是 CISC ISA,这是正常的。如果您想知道现代微架构如何在内部实现它,请参阅 realworldtech.com/sandy-bridgestackoverflow.com/tags/x86/info 中的其他链接

标签: assembly x86


【解决方案1】:

命名寄存器用于在指令之间保存值,ALU 有内部寄存器,这些值被保存到可以对其执行操作为止。

值不必从内存到寄存器再到 ALU,它可以直接从内存到 ALU。

【讨论】:

    【解决方案2】:

    x86 架构并不强制要求每条算术/逻辑指令都必须将其操作数放在寄存器中。实际上,两个操作数都可以是寄存器,一个是寄存器,另一个是内存中匹配大小的操作数的有效地址,或者是中间值。

    因此,当执行 MUL 指令时,除了将两个寄存器相乘之外,它只是从任何位置获取其操作数,将它们放入内部(程序员无法使用)寄存器,然后执行操作。

    随着 x86 架构的每次演进,确切的过程都有很大的不同。一些 CPU 会进行寄存器重命名:它们有大量内部寄存器,并将它们动态地分配给刚刚分派执行的指令的操作数。其他人使用他们所谓的“保留站”(Tomasulo 算法),其中存储操作数以等待功能单元可用。

    【讨论】:

    • “它只是从任何地方获取它的操作数,把它们放在内部寄存器中”。在这种情况下,为什么不让“mul”取一个立即数,把立即数放在内部寄存器中,执行完操作后,mul清零它的内部寄存器呢?
    • 谁说不是这样的?但是,无论如何,为什么您需要 CPU 在执行操作后清除内部寄存器?通常一个寄存器有一个值,直到需要它有另一个值
    • 谢谢你,我就是不太明白,如果它这样工作,为什么我们不能执行:mul imm ? (立即)。 " 我刚刚讲过清零,因为这个过程迟早会发生,而且由于程序员无法访问内部寄存器,因此保留那里的值不会带来任何好处。"
    • 寄存器重命名是使用 Tomasulo 算法完成的,这些基本上是同义词。保存 uops 结果的选项(如内存源 mul 的加载部分或 ALU 部分)是物理寄存器文件,如现代 Intel 和 AMD,或 Reorder Buffer(如 Intel P6 系列)。 “预约站”又称“调度员”;它只跟踪未执行的微指令;他们在被成功派遣执行后离开。它不包含操作数。
    • 查看realworldtech.com/merom(Core 2 使用 ROB 保存操作数)与 Intel 切换到使用 PRF 时的realworldtech.com/sandy-bridge
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多