使用可变内联汇编设置寄存器

时间:2014-11-10 06:26:53

标签: c gcc inline-assembly

我的要求是使用带内联汇编的变量设置EDI寄存器。我编写了以下代码片段,但无法编译。

uint32_t value = 0;
__asm__ __volatile__("mov %1,%%edi \n\t"
                      : "=D"
                      : "ir"  (value)
                      :
                      );

我得到的错误是

  

cyg_functions.cpp(544):错误:预期a"("                               :" ir" (值)                               ^

     

cyg_functions.cpp(544):内部错误:空指针                               :" ir" (值)

修改

我想我对问题规范并不清楚。我们说我的要求如下。

  • 有两个int变量val和result。
  • 我需要
    1. 将变量val的值设置为%% edi clobbering已存在的任何内容
    2. 将%% edi值乘以2
    3. 将%% edi值设置回结果变量

如何使用内联汇编表明这一点?虽然这不是我的要求,但对此(特别是第1步)的答案将解决我的问题。我需要中间体专门用于EDI寄存器。

1 个答案:

答案 0 :(得分:1)

我已经阅读了你的评论,这里的要求对我来说仍然没有意义。但是,理解并不是必需的。情况就是这样:

int main(int argc, char *argv[])
{
   int res;
   int value = argc;

   asm ("shl $1, %[res]" /* Take the value in res (aka EDI) and shift
                            it left by 1. */
      : [res] "=D" (res) /* On exit from the asm, the register EDI 
                            will contain the value for "res".  The
                            existing value of res will be overwritten. */
      : "0" (value));    /* Take the contents of "value" and put it
                            in the same place as parameter #0. */

   return res;
}

如果您从下往上阅读,这可能更容易理解。