簡體   English   中英

GNU內聯匯編問題

[英]GNU Inline assembly problem

我在c167平台特定代碼上做了一些重構,我偶然發現了一個內聯匯編問題。

上一個代碼:

  asm volatile ( "
            extp   #pag:%0, #3
            mov    r4, pof:%0   @ R4 = g_nRcvBufCount
            sub    r4, #1       @ R4 = R4 - 1
            mov    pof:%0, r4   @ g_nRcvBufCount = R4"
        : "=m" (g_nRcvBufCount)
        :
        : "r4"
  );

[

基本上,此代碼執行“g_nRcvBufCount”變量的原子遞減

“extp”指令獲取“g_nRcvBufCount”變量的“頁面”和后面的原子表達式的數量(在本例中為3)

]

當前 - 不編譯代碼:

  asm volatile ( "
            extp   #pag:%0, #3
            mov    r4, pof:%0   @ R4 = cfg->g_nRcvBufCount
            sub    r4, #1       @ R4 = R4 - 1
            mov    pof:%0, r4   @ cfg->g_nRcvBufCount = R4"
        : "=m" (cfg->g_nRcvBufCount)
        :
        : "r4"
  );

其中cfg是指向包含“g_nRcvBufCount”變量的結構的指針。

struct {
  ...
  unsigned short g_nRcvBufCount;
  ...
}cfg;

編譯中收到的錯誤是:

test.c:1124:Warning:Missing operand value assumed absolute 0. 
test.c:1124:extp #pag:[r2+#66],#3: trailing chars after expression    
test.c:1125:Warning:Missing operand value assumed absolute 0. 
test.c:1125:mov r4,pof:[r2+#66]: trailing chars after expression   
test.c:1127:Warning:Missing operand value assumed absolute 0. 
test.c:1127:mov pof:[r2+#66],r4: trailing chars after expression

任何有關如何使這項工作的提示都是受歡迎的。 關於如何訪問C / C ++結構中定義的變量的x86版本(內聯匯編)也會有所幫助。 GNU內聯匯編程序的文檔解釋“= m”關鍵字的作用也很有用。

提前致謝,

尤利安

在警告消息中查看asm:

extp #pag:[r2+#66],#3

顯然#pag: thing在它之后有一個寄存器或絕對地址有效,但是沒有更復雜的表達式已經包含像[r2+#66]那樣的偏移量。 您可能需要切換到使用包含cfg->g_nRcvBufCount 地址的 "r"參數,而不是引用它的"m"參數。

如果是這種情況,請注意原始代碼是開始時的偽造 ,並且只是因為gcc決定替換在asm中工作的簡單地址表達式才有效。

來自ibiblio

“m”:允許使用內存操作數,以及機器支持的任何類型的地址。

關於“錯誤” - 這些是“僅”警告 - 嘗試用這個程序集制作一個小的.c文件並反匯編它,看看objdump如何輸出它。 它可能會告訴您如何編輯代碼以避免出現這些警告

暫無
暫無

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

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