2017-09-18 4 views
0

Je fichier suivant l'assemblage mov.sUtilisation de ifdef en langage assembleur de gaz

.text 
    .macro test_3 
    and $3,%eax 
    .endm 

    movz: 
    movzb %al,%ax 
    movzb (%eax),%ax 
    movzb %al,%eax 
     movzb (%eax),%eax 
    .ifdef test_3 
     movzb33 %al,%rax 
     movzb (%rax),%rax 
.endif 

commande as -o dump.o movz

Dans ce code, je veux tester ifdef en langage assembleur, donc je l'ai défini test_3 macro. D'après ce que je crois comprendre, il faut imprimer le message Error: no such instruction: 'movzb33 %al,%rax' lorsque j'utilise l'assembleur mais il ne va pas à l'intérieur ifdef alors quel est le problème?

+0

Lisez la documentation de votre assembleur particulier (est-il [nasm] (http://www.nasm.us/) ou [gaz] (https://sourceware.org/binutils/docs-2.28/as/index .html)?). '.ifdef' est une directive, pas une instruction. Regardez dans le fichier objet généré (par exemple avec '' readelf' ou objdump' sous Linux) –

+0

Je sais que ce – Akshay

+0

chose Bu vous ai lu attentivement la documentation (peut-être plusieurs fois)? –

Répondre

0

.ifdef vérifie si un symbole est défini, il ne teste pas les macros. Dans GNU AS et de nombreux autres assembleurs, les macros ne peuvent être utilisées que lorsqu'une instruction est autorisée.

+1

En outre, si vous voulez * la fonctionnalité du préprocesseur C, utilisez des macros CPP. 'gcc -c foo.S' passera d'abord par CPP, donc vous pouvez utiliser' # include' et '# ifdef'. –