2016-08-29 2 views
0

J'ai une macro qui crée des étiquettes, mais je veux seulement créer ces étiquettes si elles ne sont pas déjà définies. Le problème est que l'étiquette est construite en utilisant un argument de macro, et l'assembleur n'aime pas les symboles générés en utilisant des arguments de macro. C'est le code qui ne fonctionne pas. Il a des erreurs sur le ifndef. Y a-t-il un autre moyen d'écrire cela?Assembleur GNU: création d'un symbole à l'aide d'un argument de macro

.macro create_handler modifier 
    .ifndef handler\modifier 
    handler\modifier: 
    some code 
    some more code 
    .endif 
.endif 

Erreur: indésirable à la fin de la ligne, le premier caractère non reconnu est `\ »

Répondre

0

Je pense qu'il ya deux problèmes. L'un est que \modifier: cherche un argument de macro nommé modifier:, avec les deux points. Vous devez utiliser \modifier\(): à la place. \() casse la chaîne de sorte que l'analyseur sache que vous venez de terminer le nom de l'argument.

En second lieu, le dernier .endif devrait être .endm:

.macro create_handler modifier 
    .ifndef handler\modifier 
    handler\modifier\(): 
     .4byte 0 
    .endif 
.endm 

create_handler foo 
create_handler foo 

Il en résulte dans cette liste (ignorer les numéros de ligne, j'ajouté à un de mes fichiers existants):

74 0010 00000000 create_handler foo 
    75    create_handler foo 
DEFINED SYMBOLS 
    ../src/core_dict.S:74  .text:00000010 handlerfoo 

Comme vous pouvez le voir, un seul handlerfoo a été créé.