使用一个asm命令将寄存器值读取到变量

时间:2011-02-18 10:30:36

标签: c gcc assembly inline-assembly

如何使用一个内联汇编程序命令将寄存器值读取到变量? 我在旧的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

如何实现这一结果?

2 个答案:

答案 0 :(得分:3)

这适用于我(只要r_eax / r_ebx是静态的)

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

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

答案 1 :(得分:2)

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

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