Passage d'un paramètre

Voir le sujet précédent Voir le sujet suivant Aller en bas

Passage d'un paramètre

Message par Admin le Mar 29 Nov - 21:48

Nous allons voir avec le code suivant, l'impact du passage d'un paramètre à une sous procédure.
Ici l'adresse du message est passée par un push. Ce push va décaler la pile de 8 octets et le call de la sous procédure de 8 octets à nouveau et donc la pile sera correctement alignée. Donc dans la sous procédure nous ne trouvons que l'instruction sub rsp,20h pour la réservation de place des 4 paramètres.
Code:

;programme verification alignement de la pile
; apres passage parametre par push
global Main
extern ExitProcess,MessageBoxA,GetLastError,wsprintfA    ; fonction API windows
MB_OK         equ   000h
MB_OKCANCEL      equ   001h
MB_ICONERROR   equ   010h
MB_ICONINFORMATION  equ 040h
;==============================================
;données initialisées
;==============================================
section .data
szTitre:  db 'Win64', 0
szTitreErreur:  db 'Win64', 0
szMsg:    db 'Hello world!', 0
szMsg1    db "Appel ok",0
szMsgErreur db "Erreur  N° %d",0
;==============================================
; données non initialisées
;==============================================
section .bss
szZoneRep  resb 80

section .text
Main:
    sub rsp, 28h 
    mov rcx, 0      ; handle  fenêtre
    lea rdx,[szMsg]    ; adresse du message
    lea r8,[szTitre]  ; adresse du titre de la fenêtre
    mov r9, MB_OK|MB_ICONINFORMATION      ;  type du message : OK
    call MessageBoxA
   push szMsg1
    call appel
    mov  rcx,rax    ; code retour avec le code retour de MessageBoxA
    call ExitProcess  ; fonction de fin du programme
;=================================================================
; verification lors de l'appel
;=================================================================
appel:   
   ;sub rsp,8h  inutile car la pile est alignée
   mov rax,[rsp+8]  ; récuperation de la valeur du parametre passé sur la pile
    sub rsp,20h    ; réservation place des 4 parametres
   mov rcx, 0      ; handle  fenêtre
    mov rdx,rax  ; adresse du message contenu dans ce registre (on aurait pu le mettre directement dans rdx)
    mov r8,szTitre  ; adresse du titre de la fenêtre
    mov r9, MB_OK      ;  Normal
    call MessageBoxA
   cmp rax,0
   jne .fin
   call afferreur
.fin:
    add rsp,20h    ; ATTENTION ici c'est bien 20h
    ret 8         ; RE ATTENTION nous avons passé un parametre de 8 octets
;=================================================================
; affichage du message d'erreur
;=================================================================
afferreur:   
    sub rsp,8h
    sub rsp,20h
   call GetLastError  ;récupèration du code erreur dans le registre rax
   mov rcx,szZoneRep  ; zone de retour du formatage
   mov rdx,szMsgErreur ; libellé du message
   mov r8,rax      ; code erreur
   call wsprintfA  ; on devrait tester aussi le code retour
   mov rcx, 0      ; handle  fenêtre
    mov rdx,szZoneRep  ; adresse du message
    mov r8,szTitreErreur  ; adresse du titre de la fenêtre
    mov r9, MB_OKCANCEL|MB_ICONERROR      ;  type du message : Erreur
    call MessageBoxA
.fin:   
  add rsp,28h
  ret    
Nous récupérons la valeur du paramètre par l'instruction mov rax,[rsp+8] avant de réserver la place des 32 octets.
En fin de procédure il faut veiller de libérer cette place par add rsp,20h et de terminer la sous procédure par un ret 8 qui va libèrer l'espace pris par le push de notre paramètre.
Remarque : si nous passons 2 paramètres par push (ou plus généralement un nombre pair de paramètres), nous devons réaligner la pile en remettant l'instruction sub rsp,8h.
avatar
Admin
Admin

Messages : 38
Date d'inscription : 28/11/2016

Voir le profil de l'utilisateur http://assembleur64.forumactif.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum