gcc中的汇编语句存在问题
我在试图用FreeBSD64位运行的C程序中遇到了一段汇编代码gcc中的汇编语句存在问题,c,gcc,compiler-construction,assembly,C,Gcc,Compiler Construction,Assembly,我在试图用FreeBSD64位运行的C程序中遇到了一段汇编代码 void *curbrk; __asm__ __volatile__( "movl .curbrk, %%eax;" "movl %%eax, %0" : "=r" (curbrk) :: "%eax" ); 我得到了一个类似“mov缺少后缀或操作数”的错误。(上面的代码遵循AT&T语法)是什么决定了我应该为代码使用的语法-编译器(gc
void *curbrk;
__asm__ __volatile__(
"movl .curbrk, %%eax;"
"movl %%eax, %0"
: "=r" (curbrk)
:: "%eax"
);
我得到了一个类似“mov缺少后缀或操作数”的错误。(上面的代码遵循AT&T语法)是什么决定了我应该为代码使用的语法-编译器(gcc遵循AT&T语法)或处理器(我正在使用英特尔处理器)。问题是由于代码采用AT&T语法还是我缺少了其他内容?如果您有64位GCC,除非您使用-m32开关输出32位对象代码,否则上述代码将无法完成,因为64位指针值将不适合32位EAX寄存器。使用-m32生成32位输出,或者使用rax代替eax并将movl更改为mov(不带“l”)如果您有64位GCC,除非使用-m32开关输出32位对象代码,否则上述代码将无法完成,因为64位指针值将不适合32位eax寄存器。使用-m32生成32位输出,或者使用rax代替eax并将movl更改为mov(不带“l”)您知道在GCC的amd64指令内联汇编语法中选择
mov
而不是movq
的基本原理吗?@Pascal:您可以同时使用mov
和movq
:mov
指示汇编程序“猜测”目标数据大小,而movq
表示我们谈论的是64位值。例如,mov 0,foo
将不会编译,因为汇编程序不知道变量foo
的大小,而mov 0,%%rax
将被隐式理解为movq
,因为%rax
是64位寄存器。请注意,GCC不理解上述任何内容:对于内联程序集,GCC只是将字符串转储到生成的程序集中(在替换%
-things之后):汇编程序处理它。你知道在GCC的amd64指令内联汇编语法中选择mov
而不是movq
的原理吗?@Pascal:你可以同时使用mov
和movq
:mov
指示汇编程序“猜测”目标数据大小,而movq
表示我们谈论的是64位值。例如,mov 0,foo
将不会编译,因为汇编程序不知道变量foo
的大小,而mov 0,%%rax
将被隐式理解为movq
,因为%rax
是64位寄存器。请注意,GCC不理解上面的任何内容:对于内联程序集,GCC只是将字符串转储到生成的程序集中(在替换%
-things之后):汇编程序处理它。