Zmniejszenie rozmiaru kodu może pomóc lepiej cache'ować instrukcje.
Decodowanie krótszego kodu jest szybsze.
Pętle krótsze niż 64 bajty wykonują się bardzo szybko na niektórych procesorach
Jeżeli na urządzeniu mamy ograniczoną pamięć a nie zależy nam na prędkości.
PUSH, POP, INC, DEC z rejestrami ogólnego przeznaczenia są jednobajtowe.
Instrukcje ADD, ADC, SUB, SBB, AND, OR, XOR, CMP, TEST, MOV zajmują jeden bajt mniej jeżeli są używane z rejestrem EAX.
Instrukcje po lewej są krótsze
add eax, 1000 mov eax, [mem] | add ebx, 1000 mov ebx, [mem] |
Przy skalowanym adresowaniu pewne kombinacje rejestrów, skalowań dają dłuższe instrukcje np.
Instrukcje po lewej są krótsze
mov eax, [array+ebx] mov eax, [ebx+12] mov eax, [ebx] lea eax, [ebx+ebx] | mov eax, [4*ebx] mov eax, [esp+12] mov eax, [ebp] lea eax, [2*ebx] |
Instrucje zmiennoprzecinkowe na FPU są krótsze niż odpowiadające im instrukcje na SSE
fadd st(0), st(1) ; 2 bytes addsd xmm0, xmm1 ; 4 bytes
Często aby zapisać stałą albo przesunięcie wystarcza jeden bajt. Dlatego jeżeli to możliwe dobrze jest używać bliskich skoków.
Użycie wskaźnika i jednobajtowego przesunięcia zamiast adresu.
mov ebx, [mem1] ; 6b add ebx, [mem2] ; 6b | mov eax, offset mem1 ; 5b mov ebx, [eax] ; 2b add ebx, [eax+(mem2-mem1)]; 3b |
Wiekszość instrukcji ze stałymi z zakresu od -128 do 127 są krótsze. Stałe są rozszerzane bitem znaku.
push 200 ; 5b push 100 ; 2b add ebx, 128 ; 6b add ebx, -128 ; 3b
Krótsze wersje dla inicjowania rejestru stałą
mov eax, 0 ; 5b sub eax, eax ; 2b mov eax, 1 ; 5 b sub eax, eax / inc eax ; 3 b push 1 / pop eax ; 3 b mov eax, -1 ; 5 b or eax, -1 ; 3 b
Zastąpienie stałych obliczeniami arytmetycznymi
mov [mem1], 200 ; 10 b mov [mem2], 201 ; 10 b mov eax, 100 ; 5 b mov ebx, 150 ; 5 b ; w sumie 30 bajtów | mov eax, 200 ; 5 b mov [mem1], eax ; 5 b inc eax ; 1 b mov [mem2], eax ; 5 b sub eax, 101 ; 3 b lea ebx, [eax+50] ; 3b ; w sumie 22 bajtów |