簡體   English   中英

幫助理解x86內聯匯編中的DIV指令

[英]Help understanding DIV instruction in x86 inline assembly

在閱讀GNU項目中的一些源代碼時,我遇到了一些內聯匯編:

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

這里變量qrn0n1d是64位整數。 我知道足夠的裝配來得到它的作用,但有一些我不確定的細節。

我的理解:

我們將RAX寄存器的內容除以d ,將商置於q ,並將余數放在r

我不明白

  1. 為什么這里有三個輸入? 我們只需要輸入一個被除數和一個除數,那么3個輸入有什么用?
  2. 我不知道哪個輸入是紅利。 更一般地說,我沒有看到任何實際被加載到RAX寄存器中的內容,那么它如何知道除了什么呢?

在輸入操作數規范中:

: "0" (n0), "1" (n1), "rm" (d)

由於輸出規范,寄存器“0”和“1”被強制為raxrdx

: "=a" (q), "=d" (r)

div指令族想要RDX:RAX的分子RDX:RAX 除數可以在通用寄存器中(不是以其他方式使用 - 即,不是RAXRDX )或由“rm”約束指定的存儲器。 寄存器RDXRAX和除數操作數組成3個輸入。

所以這將最終執行除法: n1:n0 / d其中n1:n0是加載到rdx:rax的數量。

正確地觀察div系列工作在固定寄存器adraxrdx for divq a寄存器從n0獲得輸入, n0是第0寄存器的別名,即a n1是一個別名為d的偽輸入,可能只是為了確保該寄存器不用於其他目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM