Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Assigner une valeur en utilisant une fonction


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Assigner une valeur en utilisant une fonction
    Bonjour, je cherche à créer une fonction qui retourne un nombre déjà connu, disant par exemple 100. Il faut que cette fonction, une fois appelée, retourne le nombre 100.

    Je travaille sur du 32 bits.

    Normalement la variable est déclarée dans le bss :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    nomb: resb 1 ; Disant que le nombre ne dépassera pas 256


    Ce que je cherche à faire c'est créer une fonction qui retourne un nombre fixe et qui le stocke dans la variable "nomb".
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     push nomb
                push 0 ; Push une valeur à la pile(stack)
                call mafonction
                pop eax ; Le nombre retourné
                add esp, 4 ; Crée un espace pour le stocker


    Dans la fonction "mafonction", c'est ici que je bloque, je sais pas vraiment si ca doit être comme ca. Mais pour moi ca marche pas (ca peut être du n'importe quoi )
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    push eax
               push ebx
               push ecx
               push edx
     
               mov eax,3 ; Lire le nombre
               mov ebx,1
               mov ecx, 100 ; Le nombre que je veux
               mov edx,1 ; Sa taille
     
               pop edx
               pop ecx
               pop ebx
               pop eax

  2. #2
    Membre du Club
    Bonsoir Neocraft. Alors, il y a plusieurs manières, registres ou pile. Le plus simple si vraiment c'est un nombre fixe c'est ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    section .bss
    resb nombre 1 
     
    section .code
    Start:
           .....
           push  word [nombre] ; architecture  32 bits oblige
           call ma_fonction
     
           ; à partir d'ici utiliser EAX comme contenant le nombre
     
    ma_fonction:
                      pop EAX ;


    j'ai juste rendu le code fonctionnel sans vouloir optimiser ou critiquer. Maintenant; je connais pas ton besoin, mais es-tu sûr que tu as besoin de cette procédure ?

  3. #3
    Membre à l'essai
    Oui oui, j'ai besoin de retourner un nombre à partir d'une fonction.

  4. #4
    Responsable Systèmes

    Tu as juste à faire :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    section .bss
    resb nombre 1 
     
    section .code
    Start:
           .....
           push  word [COLOR=black][[/COLOR]nombre] ; architecture  32 bits oblige
           call ma_fonction
     
           ; à partir d'ici utiliser EAX comme contenant le nombre
     
    ma_fonction:
                      mov EAX,100
    
                                ret


    Dans ma_fonction, je ne sauvegarde aucun registre car je ne n'en modifie aucun sauf EAX. Tu es censé préserver les registres que tu modifie sauf EAX.

    Ensuite si tu veux utiliser la fonction write pour afficher la valeur, il va d'abord te falloir convertir EAX (100 dans notre cas) en chaine de caractères.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation