[英]Trying to understand inline assembly code in C
所以我有一些代碼
#define umul_ppmm(w1, w0, u, v) \
asm ("mulq %3" \
: "=a" (w0), "=d" (w1) \
: "0" ((uint64_t)(u)), "rm" ((uint64_t)(v)))
我正在嘗試調試它,並了解它是如何工作的。
目前,我正在查看此pdf,以作為mulq
參考。
到目前為止,我的理解是它將兩個64位數字相乘,即w0
和u
。 然后將相乘的結果存儲在w0
和w1
。
我的主要問題是:
"=a"
和"=d"
中的"=a"
和"=d"
分別是地址寄存器和數據寄存器。 在這里如何發揮作用,這到底意味着什么? "0"
是什么意思? 該指南還指出“允許與指定操作數編號匹配的操作數”。 這里匹配的操作數是什么? v
如何發揮作用? 如果有的話 在函數調用之前和之后打印出變量
w1 w0紫外線
2097147 549755813889 17179869183 4611684961865433149
4294966311 17179869183 13835060159816138691 4611684961865433149
mulq
指令在a
和d
寄存器(通常稱為rax
和rdx
)中隱式生成結果。 "0"
表示與第一個操作數w0
相同的位置。 mulq
隱式使用rax
作為輸入操作數之一,因此匹配約束。 可以再次將其寫為"a"
。 v
是操作數%3
,它是mulq
指令中引用的唯一顯式操作數。 該代碼將u
和v
相乘,因此當然可以“發揮作用”。 您打印了錯誤的寄存器,在第二行交換了w0
和u
,因為u
和v
是不變的輸入操作數。 u*v=w1*2^64+w0
,即17179869183*4611684961865433149=4294966311*2^64+13835060159816138691
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.