Optymalizacja dostępu do pamięci
Wyrównaj stos

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
Przed wywołaniem funkcji stos powinien być wyrównany, potem został odłożony adres powrotu (4 bajty) dlatego alokując 28 bajtów nadaj pozostanie wyrównany.

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


Tomasz Kapela, Kraków 2011-2020