assembly 后端错误:64位模式不支持32位绝对寻址

8wigbo56  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(181)

我正在使用gcc在mac上运行ASM intel_syntax nofprefix,由于某种原因,我在后端不断收到这个错误: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);
}
0pizxfdo

0pizxfdo1#

是的,正如错误所说,在osx上不允许使用byte ptr [c]汇编到的绝对引用。作为一个变通方案,您可以尝试byte ptr c[rip]
请注意,在内联汇编块中切换语法是非常糟糕的做法,您应该使用-masm=intel编译器开关。另外,gcc内联asm不应该像这样使用,通常您使用约束机制来引用参数。

相关问题