我做了一些重構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內聯彙編器的文檔也很有用。
由於提前,
尤利安
感謝您的補充信息。 – INS 2010-11-29 14:33:02