3 votes

Passer un argument de C à l'assemblage ?

Comment puis-je passer un argument d'une fonction principale C à une fonction d'assemblage ? Je sais que ma fonction personnalisée doit ressembler à quelque chose comme :

void function(char *somedata) __attribute__((cdecl));

Maintenant, comment pourrais-je utiliser somedata dans un fichier d'assemblage. Mon système d'exploitation est Linux Ubuntu et mon processeur est x86.

13voto

jwwishart Points 1327

Je suis un peu novice en la matière, mais j'espère que cet exemple vous mettra sur la voie. Je l'ai testé et il fonctionne, le seul problème que vous pourriez avoir est que le logiciel n'est pas disponible. J'utilise nasm pour l'assemblage.

main.c

extern void myFunc(char * somedata);

void main(){
    myFunc("Hello World");
}

monFunc.asm

section .text
    global myFunc
    extern printf

    myFunc:
        push ebp
        mov  ebp, esp

        push dword [ebp+8]
        call printf 

        mov esp, ebp
        pop ebp
        ret

COMPILE

nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main

Notes :

Vous devez installer nasm (assembleur) (ubuntu c'est : sudo apt-get install nasm)

Ce qui se passe essentiellement dans le code c appelle le myFunc avec un message. Dans myFunc.asm nous obtenons l'adresse du premier caractère de la chaîne de caractères (qui est dans [ebp+8] voir ici pour plus d'informations (http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html voir 9.1.2 qui décrit quelque peu les conventions d'appel en c.) et nous la passons à la fonction printf (en la poussant sur la pile). printf est dans la bibliothèque standard c que gcc liera automatiquement dans notre code par défaut à moins que nous ne le disions pas.

Nous devons exporter myFunc dans le fichier d'assemblage et déclarer myFunc comme une fonction extrnale dans le fichier main.c. Dans myFunc.asm nous importons également la fonction printf de stdlib afin de pouvoir sortir le message le plus simplement possible.

J'espère que cela vous aidera un peu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X