Asm coding tricks

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

  1. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    2Y_Mur то изврат )
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    проверить условие типа
    Код (Text):
    1. if ((a<0)and(b>0))or((a>0)and(b<0))then
    можно так
    Код (Text):
    1. if a xor b<0 then
    то есть
    Код (Text):
    1. xor eax,ebx
    2. jnl @false
    3. -//-
    4. @false:
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    murder
    Имхо, не совсем.
    ==
    if a*b<0 then
    , что на асме при знаковых a и b можно привести к
    xor eax,ebx
    jns @false
     
  4. Ravager

    Ravager New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    [deleted]
     
  5. Ravager

    Ravager New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Сообщения чего-то не туда постятся. Ответ на сообщение почему-то в конце всего форума.
     
  6. Ravager

    Ravager New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Цикл, выполняемый дважды:

    xor ecx,ecx
    begin:
    <тело цикла>
    dec ecx
    jp begin
     
  7. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    ИМХО лучше
    Код (Text):
    1. test eax,eax
    2. jns .endif
     
  8. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Marazm
    4 байта. Проверка на -1 или 0xffffffff
    4 байта. Проверка на отрицательность.

    Разные вещи
     
  9. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    _basmp_
    я и не говорил, что это одинаковые вещи:) просто в данном случае если результат отрицательный - это именно -1.
     
  10. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Будет работать правильно в любом случае.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.801
    1) результат test ebx,eax и test eax,ebx будет одинаковый
    [ удалено Mikl___]
    3) проверка, что в двух регистрах ноль or eax,edx
    4) div/idiv edx, div/idiv dx, div/idiv ah будут давать "деление на ноль" при любых значениях в edx и eax
     
  12. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Mikl___
    неверное утверждение, простейший пример: eax = 1, edx = 2 тоже установит ZF
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.801
    KeSqueer
    Упс [​IMG]
     
  14. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Mikl___
    Для idiv - неверно, edx:eax=FFFFFFFF:FFFFFFFF замечательно знаково делится на edx=FFFFFFFF, выдавая eax=1 и edx=0.
     
  15. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Сколько значений можно поймать одним cmp и несколькими jcc? У меня выходит пять (и два диапазона):
    Код (Text):
    1.         cmp     al, 2
    2.         jz      al_02           ; al==2
    3.         jc      al_be_01
    4.         jo      al_80_or_81
    5.         js      al_in_82...FF   ; al in [0x82, 0xFF]
    6. al_in_03...7F:                  ; al in [3, 0x7F]
    7. ;...
    8.  
    9. al_be_01:
    10.         jpe     al_01           ; al==1
    11. al_00:                          ; al==0
    12. ;...
    13.  
    14. al_80_or_81:
    15.         jpe     al_80           ; al==0x80
    16. al_81:                          ; al==0x81
     
  16. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    baldr
    Если регистр можно портить, то как минимум 8:
    Код (Text):
    1. shl al,6
    2. jc switch2
    3. jz case0
    4. jp case3
    5. js case2
    6. case1:
    7.  
    8. switch2:
    9. jz case4
    10. jp case7
    11. js case6
    12. case5:
    Ну а если смотреть по диапазонам и учитывать флаг OF, то при другой инструкции "сравнения"(разрушающей) может быть больше вариантов.
     
  17. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Black_mirror
    Имея 5 флагов и пост #76, !5 = 1*2*3*4*5 = 120.
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    edemko
    Вас не смущает такая большая цифра?
    Имея 5 флагов 2*2*2*2*2 = 32.
     
  19. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    KeSqueer
    Смущает, процессору одинаково в каком порядке стоят флаги, главное, что те выставлены или сброшены, чего я не учел.
    Представляю инструкцию JBCZOS .LABEL :)
     
  20. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Black_mirror,

    Где cmp? :derisive:
    В общем-то верно: из шести арифметических флагов остаются четыре (AF трудно употребить, а OF от длинного сдвига дуреет). Это в идеале даёт 16 вариантов (после shl al, 5), однако загвоздка в том, что PF слишком глобален и путает, скажем, 1 и 2. Но выход есть: так как старший из трёх выживших бит проверен через SF, влияние на чётность оставшихся двух можно легко различить.

    Табличный переход, естественно, экономнее. В принципе эта эквилибристика полезна скорее реверсеру чтобы понимать, куда ветер сдувает управление. :derisive:

    ----8<----
    KeSqueer,

    Флаги неортогональны.