Appel d’une fonction C dans l’assembly

En dépit de toutes mes recherches, je n’ai trouvé aucune solution à mon problème. Le problème est qu’il a défini une fonction “hello_world ()” dans un fichier C “hello.c” et que je souhaite appeler cette fonction dans un fichier assembly. “hello_assembly.asm”. Est-ce que quelqu’un peut m’aider? Je vous remercie.

Vous pouvez vérifier l’exemple ci-dessous qui pourrait vous donner une idée.

\#include  int main(void) { signed int a, b; a=5,b=25; mymul(&a,&b); printf("\nresult=%d",b); return 0; } 

mymul est une fonction qui est écrite en langage assembleur dans un fichier appelé mymul.S

Ci-dessous le code pour mymul.S

 .globl mymul mymul: pushl %ebp # save the old base pointer register movl %esp, %ebp #copy the stack pointer to base pointer register movl 8(%ebp), %eax # get the address of a movl 12(%ebp), %ebx # get the address of b xchg (%eax), %ecx # we get the value of a and store it in ecx xchg (%ebx), %edx # we get the value of b and stored it in edx imul %ecx,%edx # do the multiplication xchg %ecx, (%eax) #save the value back in a xchg %edx, (%ebx) # save the value back in b movl %ebp, %esp # get the stack pointer back to ebp popl %ebp #restore old ebp ret #back to the main function 

Nous utilisons la commande “cc” pour comstackr nos programmes ci-dessus

 $ cc mymul.S mul.c -o mulprogram 

Dans le fichier mul.c, lorsque nous appelons mymul, nous passons l’adresse de a et b, et ces adresses sont mises à la stack. Lorsque l’exécution du programme entre dans la fonction mymul, la stack ressemble à ceci: addressofb, addressofa, returnaddress, oldebp

nous obtenons la valeur stockée dans l’adresse de a et l’adresse de b en utilisant xchg (nous pourrions utiliser movl ici), faisons la multiplication et sauvegardons le résultat en b.

J’espère que le programme ci-dessus vous aide.

conventions d’appel gcc

La documentation de gcc devrait préciser cela plus en détail.

Si vous ne parvenez pas à trouver de la documentation pour votre compilateur et votre environnement, nous vous suggérons de comstackr votre fonction C dans une liste d’assembleurs et de voir comment elle s’attend à ce que les arguments soient transmis et ce qu’elle laisse sur la stack lors de la fermeture.