2010-12-02 7 views
2

Comment passer un argument d'une fonction principale C à une fonction d'assemblage? Je sais que ma fonction personnalisée doit ressembler à:Passer un argument de C à l'assemblage?

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.

Répondre

12

Je suis un peu un noob à cela mais j'espère que cet exemple vous mettra sur votre chemin. Je l'ai testé et cela fonctionne, le seul problème que vous pourriez avoir est un logiciel qui n'est pas disponible. J'utilise nasm pour l'assemblage.

main.c

extern void myFunc(char * somedata); 

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

myFunc.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 il est : sudo apt-get install nasm) 0 Ce qui se passe essentiellement dans le code c appelle myFunc avec un message. Dans myFunc.asm nous obtenons l'adresse du premier caractère de la chaîne (qui est dans [ebp + 8] voir ici pour information (http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html voir 9.1.2 qui décrit un peu les conventions d'appel c) et nous le passons à la fonction printf (en le poussant sur la pile) .printf est dans la bibliothèque standard c que gcc liera automatiquement à notre code par défaut sauf si nous disons non

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 que nous puissions afficher le message en tant que tout simplement possible

+0

Exactement ce que je cherche. –

+2

@jwwishart Vous avez maintenant 1337 points de réputation. Ce serait dommage si quelqu'un vous votait, n'est-ce pas? ^^ – displayname

Questions connexes