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