我做了一些重构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