Y_Mur 1) Насчет AAM наверное шутите? AL->tempAL tempAL/10->AH tempAL MOD 10->AL код AAM D4 0A если написать db 0D4, imm8 AL->tempAL tempAL/imm8->AH tempAL MOD imm8->AL 2) магик дивидер -- это замена операции деления на умножение и сдвиг, а сдесь два сложения и сдвиги
Mikl__ Да нет, т.к. AAM корректно делит только AL, т.е. EAX < 256, а у твоего варианта допустимый диапазон еще меньше, так что о делении EAX можно говорить с большой натяжкой А вот mov edx, 1999999A + mul edx -> (результат в edx) корректно работает до eax=40000004h и уступает твоему варинту по скорости только на дебильных P4 Prescott+
Мои 5 копеек: дешёвый по р-ру способ вызовов АПИ Код (Text): mov esi,CreateWindowEx *** call DWORD [esi-CreateWindowEx + LoadIcon] *** call DWORD [esi-CreateWindowEx + LoadIcon] *** call DWORD [esi] Выигрыш в размере, когда адреса в IAT усладываются по смещению в -128...127 от CreateWindowEx в данном случае, иначе размер такой-же. /П.С. храним базу в сохраняемых регистрах/
censored, по такой логике, тогда что в этой ветке не баян? /а на фасме сам числюсь, там таких веток много про small/handmade pe/
В коде иногда приходится иметь дело с анализом BOOL переменной и затем переход, естественно, на нужный участок. Можно сэкономить на сравнении (не выполнять инструкцию CMP): Код (Text): mov ecx, BOOL variable jecxz .jump if FALSE ; continue if TRUE
AsmGuru62 спасибо за замечание censored буду внимательнее если переменная BOOL, то Код (Text): mov eax, BOOL variable dec eax jnz .jump if FALSE ; continue if TRUE jecxz только короткие переходы а по размеру mov eax,X/dec eax/jnz и mov ecx,X/jecxz одинаковы плюс замена на jz иммитирует jecxnz
Вместо бранчей использовать параллельное вычисление. Например: Код (Text): if ( i > 0 ) { k = 0xDEFACED; } else { k = 0xDEADC0DE; } для первых Пентиумов транслируем в Код (Text): mov eax, 0xDEFACED mov edx, 0xDEADC0DE xor ecx, ecx cmp i, 0 setg ecx mul ecx, 32 // заменить на сдвиг shld eax, edx, cl для более поздних сойдет и cmovge.
MSVC: Код (Text): ; k = (i>0)?0xDEFACED:0xDEADC0DE mov ecx, i xor eax, eax test ecx, ecx setle al dec eax and eax, 792849423 ; 2f41ec0fH add eax, -559038242 ; deadc0deH
что по вашему лучьше использовать в плане быстродействия? Код (Text): cmp ax, 4550h jne err Код (Text): sub ax, 4550h test ax, ax jne err ... add ax, 4550h