帮助理解x86内联汇编中的DIV指令

Cha*_*l72 5 c x86 gcc division inline-assembly

在阅读GNU项目中的一些源代码时,我遇到了一些内联汇编:

__asm__ (
  "divq %4"
  : "=a" (q), "=d" (r)
  : "0" (n0), "1" (n1), "rm" (d)
);
Run Code Online (Sandbox Code Playgroud)

这里的变量q,r,n0,n1,和d是64位整数.我知道足够的装配来得到它的作用,但有一些我不确定的细节.

我的理解:

我们将RAX寄存器的内容除以d,将商放入q,并将余数放入r.

我不明白

  1. 为什么这里有三个输入?我们只需要输入一个被除数和一个除数,那么3个输入有什么用?
  2. 我不知道哪个输入是红利.更一般地说,我没有看到任何实际被加载到RAX寄存器中的内容,那么它如何知道除了什么呢?

Mic*_*urr 4

在输入操作数规范中:

: "0" (n0), "1" (n1), "rm" (d)
Run Code Online (Sandbox Code Playgroud)

由于输出规范,寄存器“0”和“1”被强制raxrdx

: "=a" (q), "=d" (r)
Run Code Online (Sandbox Code Playgroud)

指令div系列希望分子为RDX:RAX。除数可以位于通用寄存器(不以其他方式使用 - 即 notRAXRDX)或内存中,由“rm”约束指定。寄存器RDXRAX和除数操作数组成 3 个输入。

因此,这最终将执行除法: n1:n0 / d其中n1:n0是加载到 中的数量rdx:rax

  • @Jens:这是正确的。但请记住(就像较小的操作数除法运算一样)如果商最终对于“rax”目标寄存器来说太大,您将得到除法异常。 (2认同)