代码之家  ›  专栏  ›  技术社区  ›  INS

GNU内联装配问题

  •  3
  • INS  · 技术社区  · 14 年前

    我做了一些重构 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”变量的“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
    

    欢迎提供任何有关如何实现此功能的提示。此外,X86版本(内联程序集)如何访问C/C++结构中定义的变量将是有益的。GNU内联汇编程序的文档解释“=m”关键字的作用也很有用。

    事先谢谢,

    尤利安

    2 回复  |  直到 14 年前
        1
  •  2
  •   R.. GitHub STOP HELPING ICE    14 年前

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

    #pag: [r2+#66] "r" cfg->g_nRcvBufCount "m"

        2
  •  1
  •   fazo    14 年前