所以我有一些代码

#define umul_ppmm(w1, w0, u, v)                         \
  asm ("mulq %3"                                        \
       : "=a" (w0), "=d" (w1)                           \
       : "0" ((uint64_t)(u)), "rm" ((uint64_t)(v)))


我正在尝试调试它,并了解它是如何工作的。

目前,我正在查看This pdf以供mulq参考。

到目前为止,我的理解是它将两个64位数字相乘,分别是w0u。然后,将乘法结果存储在w0w1中。

我的主要问题是:


根据This GCC assembly guide on Simple Constraints"=a""=d"中的'a'和'd'分别是地址和数据寄存器。在这里如何发挥作用,这到底意味着什么?
在这种情况下"0"是什么意思?该指南还指出“允许与指定操作数编号匹配的操作数”。这里匹配的操作数是什么?
v如何发挥作用?如果有的话


在函数调用之前和之后打印出变量


  w1 w0 u v
  
  2097147 549755813889 17179869183 4611684961865433149
  
  4294966311 17179869183 13835060159816138691 4611684961865433149

最佳答案

mulq指令在ad寄存器(通常称为raxrdx)中隐式产生结果。
操作数从零开始索引。因此,"0"与第一个操作数w0的位置相同。 mulq隐式使用rax作为输入操作数之一,因此匹配约束。可以再次将其写为"a"
v是操作数%3,它是mulq指令中引用的唯一显式操作数。该代码将uv相乘,因此当然可以“发挥作用”。


您错误地打印了寄存器,在第二行交换了w0u,因为uv是不变的输入操作数。
u*v=w1*2^64+w0,即17179869183*4611684961865433149=4294966311*2^64+13835060159816138691

07-24 09:45