2016-03-07 1 views
3

Salut je travaille sur ASM intel_syntax noprefix sur un mac en utilisant gcc, pour une raison que j'obtiens toujours cette erreur dans le backend: 32 bits l'adressage absolu n'est pas pris en charge en mode 64 bits Est-ce que cela a à voir avec les variables, à l'heure actuelle, est utilisé sur l'ASM en ligne?erreur dans le backend: l'adressage absolu 32 bits n'est pas supporté en mode 64 bits

voici mon code:

#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); 
} 
+0

Le machi abi utilise du code relogeable, donc vous ne pouvez pas utiliser l'adressage absolu. Si vous voulez obtenir un peu plus de connaissances sur la façon dont cela fonctionne, voici une autre question/réponse qui explique: http://stackoverflow.com/questions/25799551/why-does-this-movq-instruction-work-on-linux-and -not-osx/25804623 # 25804623 et apple docs: https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html#//apple_ref/doc/uid/TP40000895 –

+0

Long histoire courte, utilisez 'GOTPCREL' (même si vous n'êtes pas sûr de son utilisation en ligne) ... ou compilez en 'i386' seulement; Prenez aussi le bon conseil de Jester ... –

+0

En ajoutant simplement -m32 fonctionne, mais je ne sais pas si c'est la meilleure façon d'y aller. –

Répondre

3

Oui, comme l'erreur dit, sur osx vous n'êtes pas autorisé à utiliser des références absolues qui byte ptr [c] réunit pour. Pour contourner le problème, vous pouvez essayer byte ptr c[rip].

Notez qu'il est très mauvais de commuter la syntaxe dans le bloc d'assemblage en ligne, vous devez utiliser le commutateur du compilateur -masm=intel. De plus, gcc inline asm n'est pas censé être utilisé comme ça, normalement vous utilisez le mécanisme de contrainte pour référencer les arguments.

+0

Lors de l'utilisation de gcc [basic asm] (https://gcc.gnu.org/onlinedocs/gcc/Basic-Asm.html) (par opposition à [extended] (https://gcc.gnu.org/onlinedocs/gcc /Extended-Asm.html)), les registres devraient avoir la même valeur en sortie qu'ils ont en entrée. Même accéder aux globals à partir d'asm basique est risqué: "L'accès en toute sécurité aux données C et aux fonctions d'appel depuis asm basique est plus complexe qu'il n'y paraît." Pour accéder aux données C, il est préférable d'utiliser extended asm. " –

+0

@DavidWohlferd: Est-ce la même chose pour Clang? –

+0

Je viens de faire un test simple, et il semble que les clangs gère correctement. –