【问题标题】:Problem with assembly statements in gccgcc 中的汇编语句问题
【发布时间】:2011-04-25 09:44:00
【问题描述】:

我在尝试在 FreeBSD 64 位中运行的 C 程序中遇到了一段汇编代码。

void  *curbrk;   
__asm__ __volatile__(
        "movl .curbrk, %%eax;"
        "movl %%eax, %0"
            : "=r" (curbrk)
            :: "%eax"
    );

我收到类似“mov 缺少后缀或操作数”的错误。(上面的代码遵循 AT&T 语法)什么决定了我应该用于代码的语法 - 编译器(gcc 遵循 AT&T 语法)或处理器(我是在英特尔处理器上工作)。问题是因为代码是 AT&T 语法还是我还缺少什么?

【问题讨论】:

    标签: c gcc compiler-construction assembly


    【解决方案1】:

    如果你有 64 位 GCC,除非你使用 -m32 开关输出 32 位目标代码,否则上述代码将无法完成,因为 64 位指针值将不适合 32 位 EAX 寄存器.要么使用 -m32 生成 32 位输出,要么使用 rax 代替 eax 并将 movl 更改为 mov(不带 'l')

    【讨论】:

    • 您知道在 GCC 的 amd64 指令的内联汇编语法中选择 mov 而不是 movq 的理由吗?
    • @Pascal:您可以同时使用movmovqmov 指示汇编器“猜测”目标数据大小,而movq 表示我们正在谈论 64-位值。例如,mov 0, foo 不会编译,因为汇编器不知道变量foo 的大小,而mov 0, %%rax 将被隐式理解为movq,因为%rax 是一个64 位寄存器。请注意,GCC 不理解上述任何内容:使用内联汇编时,GCC 只是将字符串转储到生成的程序集中(在替换 %-things 之后):assembler 处理它。跨度>
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多