2010-11-29 209 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