繁体   English   中英

GNU内联汇编问题

[英]GNU Inline assembly problem

我在c167平台特定代码上做了一些重构,我偶然发现了一个内联汇编问题。

上一个代码:

  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版本(内联汇编)也会有所帮助。 GNU内联汇编程序的文档解释“= m”关键字的作用也很有用。

提前致谢,

尤利安

在警告消息中查看asm:

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

显然#pag: thing在它之后有一个寄存器或绝对地址有效,但是没有更复杂的表达式已经包含像[r2+#66]那样的偏移量。 您可能需要切换到使用包含cfg->g_nRcvBufCount 地址的 "r"参数,而不是引用它的"m"参数。

如果是这种情况,请注意原始代码是开始时的伪造 ,并且只是因为gcc决定替换在asm中工作的简单地址表达式才有效。

来自ibiblio

“m”:允许使用内存操作数,以及机器支持的任何类型的地址。

关于“错误” - 这些是“仅”警告 - 尝试用这个程序集制作一个小的.c文件并反汇编它,看看objdump如何输出它。 它可能会告诉您如何编辑代码以避免出现这些警告

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM