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.
我不明白
在输入操作数规范中:
: "0" (n0), "1" (n1), "rm" (d)
Run Code Online (Sandbox Code Playgroud)
由于输出规范,寄存器“0”和“1”被强制rax:rdx
: "=a" (q), "=d" (r)
Run Code Online (Sandbox Code Playgroud)
指令div系列希望分子为RDX:RAX。除数可以位于通用寄存器(不以其他方式使用 - 即 notRAX或RDX)或内存中,由“rm”约束指定。寄存器RDX、RAX和除数操作数组成 3 个输入。
因此,这最终将执行除法: n1:n0 / d其中n1:n0是加载到 中的数量rdx:rax。