【发布时间】:2010-11-29 12:50:19
【问题描述】:
我对@987654321@ 平台特定代码进行了一些重构,但偶然发现了内联汇编问题。
之前的代码:
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”变量的“page”和后面的原子表达式的数量(在本例中为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 内联汇编器文档也很有用。
提前致谢,
尤利安
【问题讨论】:
标签: c++ c gnu inline-assembly