Une solution miracle !!

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

Une solution miracle !!

Message par Admin le Jeu 1 Déc - 20:33

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.
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    
avatar
Admin
Admin

Messages : 37
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