在阅读GNU项目中的一些源代码时,我遇到了一些内联汇编:
__asm__ (
"divq %4"
: "=a" (q), "=d" (r)
: "0" (n0), "1" (n1), "rm" (d)
);
此处变量q
,r
,n0
,n1
和d
是64位整数。我知道足够多的装配来得到它的作用,但有一些我不确定的细节。
我的理解:
我们将RAX寄存器的内容除以d
,将商置于q
,并将余数放在r
。
我不明白
答案 0 :(得分:4)
在输入操作数规范中:
: "0" (n0), "1" (n1), "rm" (d)
由于输出规范,寄存器“0”和“1”被强制为rax
和rdx
:
: "=a" (q), "=d" (r)
div
指令系列需要RDX:RAX
中的分子。除数可以在通用寄存器中(未使用 - 即,不是RAX
或RDX
)或内存,由“rm”约束指定。寄存器RDX
,RAX
和除数操作数组成3个输入。
因此,最终会执行除法:n1:n0 / d
其中n1:n0
是加载到rdx:rax
的数量。
答案 1 :(得分:0)
正确地看到div
系列适用于a
的固定寄存器d
和rax
,rdx
和divq
。 a
寄存器从n0
获取其输入,该输入别名为第0个寄存器,即a
。 n1
是一个别名为d
的虚拟输入,可能只是为了确保该寄存器不用于其他目的。