- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
cmp DWORD PTR [esi+4], 0 ; if obj->curChip == 0
push ebx
push edi
jne SHORT $LN8@harddetect
movzx ebx, WORD PTR [esi+12] ; ebx = obj->baseport;
jmp SHORT $LN9@harddetect
$LN8@harddetect:
mov ax, WORD PTR [esi+12] ;\
add ax, 2 ; шедевр!
movzx ebx, ax ;/
$LN9@harddetect:
что-то мне говорит что у тебя там в коде реальное спагетти топов данных с результирующими неявными конвертациями - которые в асме становятся явными. и если это так, то я думаю что компилер сгенерил код подобающий тому что ты написал. например факт того что port был сконвертирован в 32бит число, наталкивает на мысли.
Что тебя смущает? Использование лишнего регистра АХ? Это не стоит того, чтобы постить такой код сюда.
Почти ровно в два раза короче и без тормозных префиксов.
> inc ebx
LOL`D
Попробуй вот так:
Минус две ненужных строки.
Алё, автор работает с портами и хочет иметь компактный код, дрова походу пишет, какая нахрен преждевременная оптимизация?
1) "push word ptr [esi+12]" - по размеру соответствует двум командам "push ebx \ movzx ebx, [esi+12]", а в дальнейшем использование ebx, вместо значения на стэке, куда как компактнее и шустрее.
2) портить выравнивание стэка без крайней необходимости бывает иногда больно.
3) "add word ptr [esi+12], 2" - занимает 4 байта + байт префикса. Итого 5 байт вместо 2-х ("inc ebx" - 1 байт).
4) главное, изменяя непосредственно значение baseport (esi+12) после нескольких вызовов будешь иметь в baseport что угодно, только не адрес порта.
И это на пять строк кода. Страшно представить, что было бы, дай тебе задание написать код на десяток-другой тысченок строк :D
Насчёт переходов и лишнего регистра полностью согласен, можно и сократить. А вот movzx ebx,... и push ebx нужно переставить, иначе в стеке будет не то, что ожидалось.
Push и movzx перепутал уже при копипасте, здесь окошко маленькое и плохо видно код.
Вероятно, для хранения переменных половинки регистров он выделять не умеет, хотя для промежуточных вычислений — запросто. Может быть, просто страховка?