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

asm*_*dan 5 c assembly gcc 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));
Run Code Online (Sandbox Code Playgroud)

结果我得到了这个:

mov    %eax,%eax
mov    %eax,0x1944b8
mov    0x1944b8,%eax
mov    %ebx,%eax
mov    %eax,0x1944bc
mov    0x1944bc,%eax
Run Code Online (Sandbox Code Playgroud)

但我只需要:

mov    %eax,0x1944b8
mov    %ebx,0x1944bc
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*kH. 3

这对我来说是这样的(只要r_eax/r_ebx是静态的)

asm ("movl %%eax, %0\n"
     "movl %%ebx, %1\n"
     : "=m"(r_eax), "=m"(r_ebx));
Run Code Online (Sandbox Code Playgroud)

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