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

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

最佳答案

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

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

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

关于c - 使用一个asm命令将寄存器值读取到变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5040191/

10-13 02:37