【问题标题】:error in backend: 32-bit absolute addressing is not supported in 64-bit mode后端错误:64 位模式不支持 32 位绝对寻址
【发布时间】:2016-03-07 01:44:19
【问题描述】:

您好,我正在使用 gcc 在 mac 上处理 ASM intel_syntax noprefix,由于某种原因,我不断收到此后端错误:64 位模式不支持 32 位绝对寻址 这是否与变量有关,目前已在 ASM 内联上使用?

这是我的代码:

#include <stdio.h>

char c, b;

int main() {

    printf("Give me letter: ");
    scanf(" %c", &c);

_

    _asm(   ".intel_syntax noprefix;"
        "xor eax, eax;"     // clear eax
        "mov al, byte ptr [c];" // save c in eax
        "cmp eax, 65;"      // eax ? "A"
        "jl Fin;"       // eax < "A" -> Fin
        "cmp eax, 90;"      // eax ? "Z"
        "jg UpC;"       // eax >= Z -> Up Case
        "add eax, 32;"      // make low case
        "jmp Fin;"      // -> Fin   
    "UpC:   cmp eax, 97;"       // eax ? "a"
        "jl Fin;"       // eax < "a" -> Fin
        "cmp eax, 122;"     // eax ? "z"
        "jg Fin;"       // eax > "z" -> Fin
        "sub eax, 32;"      // make Up Case
    "Fin:   mov byte ptr [b], al;"  // save res in b
        ".att_syntax");

    printf("Case changed : %c\n", b);
}

【问题讨论】:

标签: macos assembly x86-64 intel-syntax


【解决方案1】:

是的,正如错误所说,在 osx 上,您不允许使用 byte ptr [c] 组装到的绝对引用。作为一种解决方法,您可以尝试byte ptr c[rip]

请注意,在内联汇编块中切换语法是非常糟糕的做法,您应该使用-masm=intel 编译器开关。此外,gcc inline asm 不应该那样使用,通常您使用约束机制来引用参数。

【讨论】:

  • 当使用 gcc 的 basic asm(与 extended 相对)时,寄存器的输出值应与输入值相同。即使从基本 asm 访问全局变量也是有风险的:“从基本 asm 安全访问 C 数据和调用函数比看起来要复杂得多。要访问 C 数据,最好使用扩展 asm。”
  • @DavidWohlferd:Clang 也一样吗?
  • 我刚刚做了一个简单的测试,看起来clangs处理得很好。
  • [c + rip] 更接近于objdump -d -Mintel 的打印方式。我认为这是 Unable to move variables in .data to registers with Mac x86 Assembly 的副本(我已更新为包含 .intel_syntax 版本),但您在此处的回答是完整的并解决了 inline-asm 问题。
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多