Est-il possible d'obtenir la valeur d'un #defined entier à insérer textuellement dans une chaîne littérale qui fait partie d'une section d'assemblage dans GCC (AVR Studio) ?
Je veux que le "LEDS" soit remplacé par 48 dans la chaîne littérale du bloc asm() ci-dessous.
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, LEDS \n\t" //<-- substitution needed here
...
}
Mais je veux que le compilateur/assembleur (après que le préprocesseur ait fait son travail) voit ceci...
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, 48 \n\t" //<-- substitution needed here
...
}
Jusqu'à présent, j'ai essayé toutes les astuces de macro auxquelles je peux penser (#stringification, substitution d'arg et même #inclusion de fichiers avec diverses combinaisons de valeurs et de guillemets et ainsi de suite).
Je ne suis pas du tout familier avec la magie de l'inlining du code d'assemblage AVR dans le compilateur GCC d'AVR Studio.
J'essaie d'éviter d'avoir plusieurs occurrences du littéral "48" dans ma source. Si le préprocesseur peut effectuer cette substitution pour moi, ce serait formidable.
Edit : Ceci est pour un projet de microcontrôleur firmware - et juste pour rendre la vie intéressante, il n'y a presque pas de place libre pour l'ajout de nouveau code.