【问题标题】:Read register value to variable, with one asm command使用一个 asm 命令将寄存器值读取到变量
【发布时间】:2011-06-29 17:43:02
【问题描述】:

如何使用一个内联汇编程序命令将寄存器值读取到变量中? 我在旧的 freeBSD 系统 (v2.1 i386) 上使用 gcc。

我有这样的代码:

static volatile unsigned long r_eax, r_ebx;
asm ("movl %%eax, %0\n" :"=r"(r_eax));
asm ("movl %%ebx, %0\n" :"=r"(r_ebx));

结果我得到了这个:

mov    %eax,%eax
mov    %eax,0x1944b8
mov    0x1944b8,%eax
mov    %ebx,%eax
mov    %eax,0x1944bc
mov    0x1944bc,%eax

但我只需要:

mov    %eax,0x1944b8
mov    %ebx,0x1944bc

我怎样才能达到这个结果?

【问题讨论】:

    标签: c gcc assembly inline-assembly


    【解决方案1】:

    这对我有用(只要r_eax / r_ebx 是静态的)

    asm ("movl %%eax, %0\n"
         "movl %%ebx, %1\n"
         : "=m"(r_eax), "=m"(r_ebx));
    

    请注意,除非您在 same asm() 括号内指定汇编语言语句,否则编译器可能会决定在其间进行各种“有趣的优化”,包括对这些 reg 的修改。

    【讨论】:

      【解决方案2】:

      请注意,您正在使用约束来指示 gcc 将结果放入寄存器。所以不能直接存入内存。由于您只想存储已经存在的寄存器中的值,因此您甚至不需要任何指令,只需要约束,如下所示:

      __asm__ __volatile__ ("" : "=a" (r_eax), "=b" (r_ebx));
      

      【讨论】:

      • 可以直接将它放入内存,使用"=m"约束,这就是它的用途。看我的回答。
      • @FrankH:我的意思是,通过使用 =r 约束,他明确指示 gcc 不要将其放入内存中,因此他禁止 mov 进入内存。 “它不能直接把它放入内存” = gcc 不能,因为程序员不是这样说的。当然使用 =m 会起作用,我没有在争论。
      • 无意冒犯,抱歉。只是想指出阿斯莫丹要求的东西本身并不是不可能的,只是因为他使用了错误的约束,所以对他不起作用。
      • @FrankH:我没有被冒犯。我可能一直不清楚。我们的两个解决方案都很好,你的更明确,直接控制 movs,我把它留给编译器。
      猜你喜欢
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多