2010-11-29 326 views
3

我做了一些重構c167特定於平臺的代碼,我偶然發現了一個內聯彙編問題。GNU內聯彙編問題

上一頁代碼:

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版本(內聯彙編)將會很有幫助。解釋什麼是「= m」關鍵字的GNU內聯彙編器的文檔也很有用。

由於提前,

尤利安

回答

2

看在警告消息的ASM線索:

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

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

如果是這種情況,請注意最初的代碼是虛假開始,並且只是碰巧工作,因爲gcc決定用一個簡單的地址表達式替代在asm中工作。

+0

感謝您的補充信息。 – INS 2010-11-29 14:33:02

1

ibiblio

「M」:一個存儲器操作數被允許,與任何類型的地址的該機器支持。

關於「錯誤」 - 這些是「唯一」警告 - 嘗試使用此程序集製作一個小型.c文件並對其進行反彙編,並查看objdump如何輸出它。它可能給你如何修改你的代碼,沒有這些警告

+0

謝謝您的信息和建議。 – INS 2010-11-29 14:33:42