5

嗨,我正在使用 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);
}
4

1 回答 1

5

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

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

于 2016-03-07T01:53:40.763 回答