Utilisez l’étiquette dans l’assemblage de C

J’ai simplement besoin d’un moyen de charger l’adresse d’une étiquette, par exemple MyLabel: dans par exemple ‘src.asm’ dans une variable dans par exemple, ‘src.c’. (Ces fichiers seront liés ensemble) J’utilise gcc et nasm pour assembler ces fichiers. Comment puis-je charger l’adresse de l’étiquette?

Il y a deux étapes à cela. Tout d’abord, vous devez exporter l’étiquette en tant que globale à partir du fichier d’assemblage à l’aide de la directive global .

 global MyLabel MyLabel: dd 1234 ; data or code, in whatever section. It doesn't matter. 

Ensuite, vous devez déclarer le label comme externe en C. Vous pouvez le faire soit dans le code qui l’utilise, soit dans un en-tête.

 // It doesn't matter, and can be plain void, // but prefer giving it a C type that matches what you put there with asm extern void MyLabel(void); // The label is code, even if not actually a function extern const uint32_t MyLabel[]; // The label is data // *not* extern long *MyLabel, unless the memory at MyLabel *holds* a pointer. 

Enfin, vous obtenez l’adresse de l’étiquette en C de la même manière que vous obtenez l’adresse d’une variable.

 doSomethingWith( &MyLabel ); 

Notez que certains compilateurs ajoutent un soulignement au début des noms de variables et de fonctions C. Par exemple, GCC le fait sous Mac OS X, mais pas sous Linux. Je ne connais pas d’autres plates-formes / compilateurs. Pour plus de sécurité, vous pouvez append une instruction asm à la déclaration de variable pour indiquer à GCC le nom d’assembly de la variable.

 extern uint8_t MyLabel asm("MyLabel"); 

Vous pourriez envisager un assembleur “getter” routine.

En outre, vous pourriez peut-être simplement simuler l’étiquette pour qu’elle ressemble à une routine du classeur C, de sorte que vous puissiez prendre l’adresse de la “procédure”.