gcc中的汇编语句存在问题

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

我在试图用FreeBSD64位运行的C程序中遇到了一段汇编代码

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之后):汇编程序处理它。