Passage d'un paramètre
Page 1 sur 1
Passage d'un paramètre
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.
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.
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
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.
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|