Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用一个asm命令将寄存器值读取到变量_C_Gcc_Assembly_Inline Assembly - Fatal编程技术网

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

C 使用一个asm命令将寄存器值读取到变量,c,gcc,assembly,inline-assembly,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 0x19

如何使用一个内联汇编程序命令将寄存器值读取到变量? 我在旧的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\u eax
/
r\u ebx
是静态的)


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

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

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

您可以使用
“=m”
约束将其直接放入内存,这就是它的用途。看到我的答案了。@FrankH:我的意思是,通过使用=r约束,他明确指示gcc不要将其放入内存,因此他禁止mov进入内存。“它不能直接把它放进内存”=gcc不能,因为程序员说的不是这样。当然,使用=m也行,我不是在争论这个问题。我不是有意冒犯你,对不起。我只是想指出阿斯莫丹所要求的本身并不是不可能的,只是因为他使用了错误的约束条件,所以没有为他工作。@FrankH:我没有生气。我可能不清楚。我们的两个解决方案都很好,您的解决方案更明确,直接控制MOV,我的解决方案留给编译器。
__asm__ __volatile__ ("" : "=a" (r_eax), "=b" (r_ebx));