[英]Help understanding DIV instruction in x86 inline assembly
在閱讀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" (n0), "1" (n1), "rm" (d)
由於輸出規范,寄存器“0”和“1”被強制為rax
和rdx
:
: "=a" (q), "=d" (r)
div
指令族想要RDX:RAX
的分子RDX:RAX
。 除數可以在通用寄存器中(不是以其他方式使用 - 即,不是RAX
或RDX
)或由“rm”約束指定的存儲器。 寄存器RDX
, RAX
和除數操作數組成3個輸入。
所以這將最終執行除法: n1:n0 / d
其中n1:n0
是加載到rdx:rax
的數量。
正確地觀察div
系列工作在固定寄存器a
和d
, rax
和rdx
for divq
。 a
寄存器從n0
獲得輸入, n0
是第0寄存器的別名,即a
。 n1
是一個別名為d
的偽輸入,可能只是為了確保該寄存器不用於其他目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.