Бывает оптимизация по скорости, а бывает оптимизация по размеру. Причём во многих случаях имеет смысл именно оптимизация по размеру - ну не всё ли равно, будет некоторый код исполняться 2 мс или 3 мс? Если быстрый вариант занимает 200 байт, а медленный 50?
Во многих программах главный цикл обработки сообщений выглядит примерно так:
Code:
still:
mov eax,10
int 40h
cmp eax,1
jz redraw
cmp eax,2
jz key
cmp eax,3
jz button
jmp still
При том, что могут приходить события только 1,2,3. Вот как стоит писать этот цикл:
Code:
still:
push 10
pop eax
int 40h
dec eax
jz redraw
dec eax
jz key
button:
Первый вариант - 24 байта (если все переходы короткие), второй - 11 байт.
Далее, присутствующий код (пишу по памяти, так что в порядке сравнений могу ошибиться)
Code:
key:
mov eax,2
int 40h
cmp ah,'d'
jz ...
cmp ah,'D'
jz ...
cmp ah,'1'
jz ...
cmp ah,'2'
jz ...
cmp ah,'c'
jz @@clear
cmp ah,'C'
jz @@clear
jmp still
@@clear:
эквивалентен
Code:
key:
mov al,2 ; обратите внимание, что до этой команды eax=0
int 40h
mov al,ah
or al,20h
cmp al,'d'
jz ...
cmp al,'1'
jz ...
cmp al,'2'
jz ...
cmp al,'c'
jnz still
@@clear:
Пояснения. Команда "mov eax,xxxxxxxx" занимает 5 байт; вариант "push xx/pop eax" - 3 байта; "mov al,xx" - 2 байта. Арифметические операции с al/ax/eax имеют форму на байт короче: "cmp ah,'d'" занимает 3 байта, "cmp al,'d'" - 2 байта. Команда "or al,20h" переводит заглавные латинские буквы в маленькие, а цифры оставляет на месте.