5

こんにちは、gcc を使用して Mac で ASM intel_syntax noprefix に取り組んでいます。何らかの理由で、バックエンドでこのエラーが発生し続けます。32 ビット絶対アドレス指定は 64 ビット モードではサポートされ ていません。 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

byte ptr [c]はい、エラーが示すように、osx ではアセンブル先の絶対参照を使用できません。回避策として、 を試すことができますbyte ptr c[rip]

インライン アセンブリ ブロックで構文を切り替えることは非常に悪い習慣であることに注意してください-masm=intel。コンパイラ スイッチを使用する必要があります。また、gcc inline asm はそのように使用されることは想定されていません。通常は制約メカニズムを使用して引数を参照します。

于 2016-03-07T01:53:40.763 に答える