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