Assembleur (ASM) avec C et GCC (Gnu Compiler Collection)

Gnu Compiler Collection (GCC) offre la possibilité de manipuler des instructions en assembleur directement à partir d'un programme C.

asm()

Le programme suivant ajoute deux nombres :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

 /* On prend les arguments et convertit la chaine de caractères en integer */
 int x = atoi(argv[1]), y = atoi(argv[2]), res = 0;

        /* Execute le code ASM*/
        asm("addl %%ebx, %%eax"
            :"=r"(res)
            :"a"(x), "b"(y)
           );

        /* Montre le résultat dans la console */
        printf("%d + %d = %d\n", x, y, res);

        return 0;
}

Il faudrait vérifier le nombre et type d'arguments. Pour simplifier le code, cette partie a été volontairement ignorée.

Tout ce qui est entre les parenthèses de asm, sera interprété comme du code Assembleur.

Vous pouvez utiliser __asm__() comme alternative s'il y a un conflit dans le programme avec asm().

Ensuite, on peut compiler

gcc add.c -o add.exe

Et on exécute

add 1 2

Volatile

Si votre instruction assembleur doit être exécutée là où elle a été placée, vous pouvez utiliser le mot-clé volatile ou __volatile__ après asm et avant les parenthèses.

Sans le mot-clé volatile, le code sera optimisé par le compilateur et l'instruction assembleur peut être ignorée (Par exemple, une instruction assembleur dans une boucle).

asm volatile (...)

Vous pouvez consulter la documentation de gcc.

Commentaires