Asm coding tricks

Тема в разделе "WASM.A&O", создана пользователем S_T_A_S_, 1 янв 2005.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    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) магик дивидер -- это замена операции деления на умножение и сдвиг, а сдесь два сложения и сдвиги
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Mikl__
    Да нет, т.к. AAM корректно делит только AL, т.е. EAX < 256, а у твоего варианта допустимый диапазон еще меньше, так что о делении EAX можно говорить с большой натяжкой ;) А вот mov edx, 1999999A + mul edx -> (результат в edx) корректно работает до eax=40000004h и уступает твоему варинту по скорости только на дебильных P4 Prescott+
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Мои 5 копеек:
    дешёвый по р-ру способ вызовов АПИ
    Код (Text):
    1.         mov     esi,CreateWindowEx
    2.         ***
    3.         call    DWORD [esi-CreateWindowEx + LoadIcon]
    4.         ***
    5.         call    DWORD [esi-CreateWindowEx + LoadIcon]
    6.         ***
    7.         call    DWORD [esi]
    Выигрыш в размере, когда адреса в IAT усладываются по смещению в -128...127 от CreateWindowEx в данном случае, иначе размер такой-же. /П.С. храним базу в сохраняемых регистрах/
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    asmfan
    баян %)
    http://board.flatassembler.net/topic.php?t=215
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    censored, по такой логике, тогда что в этой ветке не баян?

    /а на фасме сам числюсь, там таких веток много про small/handmade pe/
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    В коде иногда приходится иметь дело с анализом BOOL переменной и затем переход, естественно, на нужный участок. Можно сэкономить на сравнении (не выполнять инструкцию CMP):
    Код (Text):
    1. mov ecx, BOOL variable
    2. jecxz   .jump if FALSE
    3.  
    4. ; continue if TRUE
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    AsmGuru62 спасибо за замечание censored буду внимательнее
    если переменная BOOL, то
    Код (Text):
    1. mov eax, BOOL variable
    2. dec eax
    3. jnz .jump if FALSE
    4. ; continue if TRUE
    jecxz только короткие переходы :dntknw: а по размеру mov eax,X/dec eax/jnz и mov ecx,X/jecxz одинаковы :)
    плюс замена на jz иммитирует jecxnz
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Mikl__ Найдите у себя ошибку
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    censored
    TRUE<->FALSE спасибо!
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    К слову: в Intel Optimization Manual советуют отказаться от INC и DEC для Pentium-IV и выше.
     
  12. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Вместо бранчей использовать параллельное вычисление.
    Например:
    Код (Text):
    1. if ( i > 0 )
    2. {
    3.     k = 0xDEFACED;
    4. }
    5. else
    6. {
    7.    k = 0xDEADC0DE;
    8. }
    для первых Пентиумов транслируем в
    Код (Text):
    1. mov eax, 0xDEFACED
    2. mov edx, 0xDEADC0DE
    3. xor ecx, ecx
    4. cmp i, 0
    5. setg ecx
    6. mul ecx, 32                   // заменить на сдвиг
    7. shld eax, edx, cl
    для более поздних сойдет и cmovge.
     
  13. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    MSVC:
    Код (Text):
    1. ; k = (i>0)?0xDEFACED:0xDEADC0DE
    2. mov     ecx, i
    3. xor     eax, eax
    4. test    ecx, ecx
    5. setle   al
    6. dec     eax
    7. and     eax, 792849423                          ; 2f41ec0fH
    8. add     eax, -559038242                         ; deadc0deH
     
  14. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Великолепно. Пойду посплю...
     
  15. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    что по вашему лучьше использовать в плане быстродействия?
    Код (Text):
    1. cmp ax, 4550h
    2. jne  err
    Код (Text):
    1. sub ax, 4550h
    2. test ax, ax
    3. jne err ...
    4. add ax, 4550h
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cmp считывает значение и сравнивает, sub ещё и записывает.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    1 конечно.
     
  18. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    А не подскажете самый быстрый способ целочисленного деления на 10 и взятия остатка по модулю 10?
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    spencer
    test ax, ax
    после sub - это что - суперхитрость? :)))
    maxdiver
    Загляни
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хы ) наверное для надежности :P