IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Paramètres d'une fonction


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 8
    Points
    8
    Par défaut Paramètres d'une fonction
    Bonjour

    j'aimerais savoir combien de paramètres prend la fonction fonc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fonc :
             enter 0,0
             push rbx 
             push r13
             push r12
             mov rbx, rdi
             mov r13, rsi
             mov r12 , 0
             jump test2
    Je vous remercie

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je dirais 3 (rdi + rsi + 0), les 3 push sont là pour sauvegarder les registres utilisés dans la fonctions, et les restaureras à sa fin.

    Elle m'a l'air bizarre ton ABI, tu utilise quel OS ?


    (J'éviterais d'utiliser enter/leave pour init/destroy une pile si j'étais toi et push/pop (d'ailleurs ces deux techniques sont incompatible (soit l'un soit l'autre) le enter/leave init la stack en une fois, alors que push/pop le fait de façon "dynamique" (reserve des bytes si besoin) mais terriblement nul à lire car push/pop sont comme des frères)

    Donc voici une meilleure façon d'utiliser la pile selon moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     sub     rsp, BYTE_TO_RESERVES
    ;{
        mov     [rsp], qword 32
        mov     [rsp + 8], qword 32
        ; ...
    ;}
     add     rsp, BYTE_TO_RESERVES
    Dernière modification par Invité ; 09/06/2015 à 21h32.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    en fait c'est un sujet d'examen voila l'exercice Nom : FullSizeRender.jpg
Affichages : 422
Taille : 938,5 Ko

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'hallucine oO et en plus c'est du x64 intel nasm, tu est dans quel école ?

    Bon outre le fait que faire les devoirs des autres est mal, ce genre d'exercice est un comme une sorte de miracle, de mirage pour quelqu'un comme moi ^^

    Donc je vais essayer de le résoudre et t'expliquer en même temps.

    (Tu devrais dire à ton prof d'avoir une syntaxe un peu plus propre (espaces manquants, alignement de mêmes instructions (nasm/cpu) et de datas), isolation de bloc de mini code lié, ..., la prochaine fois )


    Premierement voilà ce que je ferais comme presentation du code (utile pour sa compréhension):
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    [BITS   64]
     
    [extern     printf]
    [global     asm_main]
     
    [segment .data]
    ;{
            longIntFormat:  db  "%ld_", 0
            newLine:        db  10, 0
            a:              dq  -23, 34, 51, 65, -32, 12, 67
    ;}
    [segment .bss]
    ;{
    ;}
    [segment .text]
    ;{
            asm_main:
           ;{
                ; enter   0, 0
                push    r12
               ;{
     
                    mov     r12, 7
     
                    et1:
                   ;{
                            mov     rdi, a 
                            mov     rsi, r12
                        call    fonc
     
                        sub     r12, 2
                    ;}
                    cmp     r12, 0
                    jg      et1
               ;}
                pop     r12
                ; leave
     
                mov     rax, 0
                ret    
           ;}
     
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            fonc:
            ;{
                ; enter   0, 0
                push    rbx
                push    r13
                push    r12
               ;{
                    mov     rbx, rdi
                    mov     r13, rsi
                    mov     r12, 0
                    jmp     test2
     
                    next2:
                   ;{
                        sub     rsp, 40
                                mov     rcx, longIntFormat
                                mov     rdx, [rbx + 8 * r12]
                            call    printf
                        add     rsp, 40
     
                        mov     rax, [rbx + 8 * r12]
                        add     rax, 2
                        mov     [rbx + 8 * r12], rax
                        inc     r12
                   ;}
                    test2:
                    cmp     r12, r13
                    jl      next2
     
                    sub     rsp, 40
                            mov     rcx, newLine
                        call    printf
                    add     rsp, 40
               ;}
                pop     r12
                pop     r13
                pop     rbx
                ; leave
     
                mov     rax, 0
                ret
            ;}
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;}
    Dernière modification par Invité ; 09/06/2015 à 21h32.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par kabyboy Voir le message
    bonjour j'aimerais savoir combien de paramètres prend la fonction fonc
    (...)
    je vous remercie
    et toi tu l'as fait l'exercice, t'as essayé quelque chose ou tu attends que shaynox ou quelqu'un d'autre te donne la réponse ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Hmm bonne question aussi, de savoir s'il à essayé de faire une démo de réponse x)

    Et aussi qu'il tente par lui-même en même temps.

    Bon, c'est parti, voici ce que j'ai trouvé;
    1- func prend 2 paramètres (rdi (a), rsi (r12)). Enfaite-on ne peut dire quels sont les vrais paramètres en jeu en ne lisant que ce qui se passe dans la fonction, il faut regarder lors de son appel.
    2- Le paramètre rdi (a) ne change jamais car c'est une référence mémoire (label), le rsi (r12) change par contre (sub r12, 2), donc logiquement à chaque appel de func, rsi (r12) vaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1st pass: 7
    2nd pass: 5
    3rd pass: 3
    4th pass: 1     ; cmp     r12, 0        = if (r12 > 0) (signed)
                    ; jg      et1           = jump     et1
    3- Alors je ne sais d'où vient la croyance qu'un bon programmeur doit savoir ce qu'un programme fait en output, rien qu'en faisant appel à son cerveau, mais je ne suis contre cette pratique (surtout en assembleur).
    Donc j'ai un peu modifié la source pour qu'il puisse s'exécuter sous Windows + sa compilation et cela me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -23_34_51_65_-32_12_67_
    -21_36_53_67_-30_
    -19_38_55_
    -17_
    Dernière modification par Invité ; 09/06/2015 à 21h21.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 8
    Points
    8
    Par défaut re
    ce n'est pas un devoir de maison c'est un examen que j'ai eu en janvier passé
    en fait je bloque sur certaines instructions
    mov rdi, longIntformat ? selon le code rdi=0 ?

    et mov rax,[rbx+8*r12] c'est une opération arithmétique ou rax=le premier élément du tableau ?

    merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    Cool alors ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov     rcx, longIntFormat          ; Store l'adresse (offset par rapport au début du fichier) de longIntFormat dans rcx
     
    mov     rax, [rbx + 8 * r12]        ; Sachant que rbx contient l'adresse d'un tableau (a) de qword (64 bit) data, alors r12 est le selecteur d'élément et 8 (octets) la taille des éléments
                                        ; Et ne pas oublier que la mémoire à ses adresses de manière linéaire, pour cela qu'il y à toujours un + après l'adresse de l'array.
    Si ton problème vient de la compréhension de l'assembleur, je t'invite à lire des tuto (http://hackasm.5gb.co/Projects/Compu.../fr/index.html + http://cs.lmu.edu/~ray/notes/nasmtutorial/ + https://software.intel.com/en-us/art...-x64-assembly) et les doc intel/nasm sans moderation: (http://www.intel.com/content/www/us/...r-manuals.html + http://nasm.us/docs.php)

    Np ^^

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 8
    Points
    8
    Par défaut shaynox
    aaaah ok ok la j'ai bien compris je te remercie ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/12/2005, 12h33
  2. Evaluations des paramètres d'une fonction
    Par WebPac dans le forum Langage
    Réponses: 15
    Dernier message: 06/10/2005, 09h46
  3. paramètres pour une fonction
    Par bul dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/05/2005, 07h49
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. Passer en paramètre d'une fonction (...)
    Par Captain_JS dans le forum C++
    Réponses: 5
    Dernier message: 03/11/2004, 07h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo