Une solution miracle !!
Page 1 sur 1
Une solution miracle !!
Sur Internet, nous trouvons une solution qui aligne la pile quelque soit son déphasage. Elle est un peu plus compliquée que les seules instructions sub rsp,8h et add rsp,8h mais elle semble fonctionner. Voici le code d'un petit programme pour tester les différents cas.
Cette solution à l’inconvénient de laisser la pile désalignée si elle était déjà désalignée avant l'appel d'une procèdure. Cela oblige à mettre ces instructions dans chaque sous-procèdure. A vous de voir votre préférence.
Cette solution à l’inconvénient de laisser la pile désalignée si elle était déjà désalignée avant l'appel d'une procèdure. Cela oblige à mettre ces instructions dans chaque sous-procèdure. A vous de voir votre préférence.
- Code:
;vidagepilesur.asm programme verification alignement de la pile
; affichage de la pile a tout coup
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 à la ligne %d ",0
szMsgForm db "Valeur de rsp : %p à la ligne %d",0
;==============================================
; données non initialisées
;==============================================
section .bss
szZoneRep resb 80
section .text
Main:
sub rsp, 8h ; alignement pile
sub rsp,20h ; reservation place (necessaire à la fonction ExitProcess)
;sub rsp,8h ; a remettre pour desaligner la pile
mov rcx,rsp
mov rdx, __LINE__ -1
call appel
mov rcx,rsp
mov rdx, __LINE__ -1
call appel
;add rsp,8h ; a remettre pour terminer correctement
mov rcx,0 ; code retour OK
call ExitProcess ; fonction de fin du programme
;=================================================================
; vidage
;=================================================================
appel:
push rsp ; sauvegarde la position courante de RSP sur la pile
push qword[rsp] ; autre copie de la pile
and spl,0F0h ; ajuste RSP pour aligner la pile au cas où elle ne le serait pas.
sub rsp, 20h ; reservation pour les 4 parametres (* 8 octets)
;appel fonction
mov r8,rcx
mov r9,rdx
mov rcx,szZoneRep ; zone de retour du formatage
mov rdx,szMsgForm ; libellé du message
call wsprintfA ; on devrait tester aussi le code retour
mov r9,__LINE__ - 1 ; verification si cette fonction est OK
cmp rax,0
je .erreur
mov rcx, 0 ; handle fenêtre
mov rdx,szZoneRep ; adresse du message formaté
mov r8,szTitre ; adresse du titre de la fenêtre
mov r9, MB_OK ; Normal
call MessageBoxA
mov r9,__LINE__ - 1 ; verification si cette fonction est OK
cmp rax,0
jne .fin ; si oui on termine la procedure
.erreur:
call afferreur
.fin:
LEA RSP,[RSP+28h] ; en fonction du nombre de parametres
pop rsp
ret
;=================================================================
; 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
; et r9 contient le N° de ligne
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_OK|MB_ICONERROR ; type du message : Erreur
call MessageBoxA
.fin:
add rsp,28h
ret
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|