【问题标题】:GNU Inline assembly problemGNU内联汇编问题
【发布时间】:2010-11-29 12:50:19
【问题描述】:

我对@9​​87654321@ 平台特定代码进行了一些重构,但偶然发现了内联汇编问题。

之前的代码:

  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


    【解决方案1】:

    查看警告信息中的asm:

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

    显然#pag: 后面有寄存器或绝对地址是有效的,但对于已经包含像[r2+#66] 这样的偏移量的更复杂的表达式则无效。您可能需要改用包含cfg->g_nRcvBufCount地址"r" 参数,而不是引用它的"m" 参数。

    如果是这种情况,请注意原始代码一开始是伪造的,只是碰巧可以工作,因为 gcc 决定替换一个在 asm 中工作的简单地址表达式。

    【讨论】:

      【解决方案2】:

      来自ibiblio

      "m" : 允许使用内存操作数,机器一般支持的任何类型的地址。

      关于“错误” - 这些是“唯一”警告 - 尝试使用此程序集制作一个小的 .c 文件并将其反汇编并查看 objdump 如何输出它。它可能会为您提供有关如何编辑代码以使其没有这些警告的线索

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2011-05-06
        • 2012-04-22
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多