- 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:
Dummy00001 22.07.2011 13:16 # +7
что-то мне говорит что у тебя там в коде реальное спагетти топов данных с результирующими неявными конвертациями - которые в асме становятся явными. и если это так, то я думаю что компилер сгенерил код подобающий тому что ты написал. например факт того что port был сконвертирован в 32бит число, наталкивает на мысли.
DemonId7 22.07.2011 15:34 # 0
Dummy00001 22.07.2011 17:09 # 0
Govnocoder#0xFF 22.07.2011 14:29 # +1
Что тебя смущает? Использование лишнего регистра АХ? Это не стоит того, чтобы постить такой код сюда.
DemonId7 22.07.2011 15:30 # 0
Почти ровно в два раза короче и без тормозных префиксов.
Govnocoder#0xFF 22.07.2011 15:39 # +3
> inc ebx
LOL`D
Попробуй вот так:
Минус две ненужных строки.
roman-kashitsyn 22.07.2011 15:56 # 0
Govnocoder#0xFF 22.07.2011 16:09 # +1
roman-kashitsyn 22.07.2011 16:25 # 0
TarasB 22.07.2011 16:34 # +1
Алё, автор работает с портами и хочет иметь компактный код, дрова походу пишет, какая нахрен преждевременная оптимизация?
roman-kashitsyn 22.07.2011 16:46 # −1
guest 22.07.2011 17:03 # −6
DemonId7 23.07.2011 04:38 # +3
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
inkanus-gray 22.07.2011 15:46 # +3
Насчёт переходов и лишнего регистра полностью согласен, можно и сократить. А вот movzx ebx,... и push ebx нужно переставить, иначе в стеке будет не то, что ожидалось.
DemonId7 23.07.2011 04:50 # 0
Push и movzx перепутал уже при копипасте, здесь окошко маленькое и плохо видно код.
inkanus-gray 23.07.2011 05:17 # 0
Вероятно, для хранения переменных половинки регистров он выделять не умеет, хотя для промежуточных вычислений — запросто. Может быть, просто страховка?
guest8 09.04.2019 11:12 # −999