Stos powinien być wyrównany do granicy 16 bajtów przed wywołaniem funkcji
w większości systemów operacyjnych.
Dobrze jest tak ułożyć lokalne zmienne aby były wyrównane do odpowiednich granic.
Bezpośrednie wyrównanie stosu
funkcja: ; jeden argument na stosie (32-bit) push ebp mov ebp, esp sub esp, zmienneLokalne and esp, 0FFFFFFF0H ; wyrównanie do 16b mov eax, [ebp+8] ; kopiowanie movdqu xmm0,[eax] ; z niewyrównanej tablic movdqa [esp],xmm0 ; do wyrównanej zmiennej lokalnej call SomeOtherFunction ... mov esp, ebp pop ebp ret
Możemy tak dobrać rozmiar danych lokalnych aby stos pozostał wyrównany
funkcja: ; (32-bit) sub esp, 28 mov eax, [esp+32] movdqu xmm0,[eax] movdqa [esp],xmm0 call SomeOtherFunction ... add esp, 28 ret
Jeżeli odkładamy wcześniej jakieś rejestry na stos to musimy je też wliczyć.
W kodzie 64 bitowym adresy są 8 bajtowe.
funkcja: ; (64-bit) sub rsp, 24 mov rax, [rsp+32] movdqu xmm0,[rax] movdqa [rsp],xmm0 call SomeOtherFunction ... add rsp, 24 ret