簡體   English   中英

試圖了解C中的內聯匯編代碼

[英]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位數字相乘,即w0u 然后將相乘的結果存儲在w0w1

我的主要問題是:

  1. 根據此GCC關於簡單約束匯編指南"=a""=d"中的"=a""=d"分別是地址寄存器和數據寄存器。 在這里如何發揮作用,這到底意味着什么?
  2. 在這種情況下, "0"是什么意思? 該指南還指出“允許與指定操作數編號匹配的操作數”。 這里匹配的操作數是什么?
  3. v如何發揮作用? 如果有的話

在函數調用之前和之后打印出變量

w1 w0紫外線

2097147 549755813889 17179869183 4611684961865433149

4294966311 17179869183 13835060159816138691 4611684961865433149

  1. mulq指令在ad寄存器(通常稱為raxrdx )中隱式生成結果。
  2. 操作數從零開始索引。 因此, "0"表示與第一個操作數w0相同的位置。 mulq隱式使用rax作為輸入操作數之一,因此匹配約束。 可以再次將其寫為"a"
  3. v是操作數%3 ,它是mulq指令中引用的唯一顯式操作數。 該代碼將uv相乘,因此當然可以“發揮作用”。

您打印了錯誤的寄存器,在第二行交換了w0u ,因為uv是不變的輸入操作數。 u*v=w1*2^64+w0 ,即17179869183*4611684961865433149=4294966311*2^64+13835060159816138691

暫無
暫無

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

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