jbe, je, jae и т.д. после test eax,eax

Тема в разделе "WASM.BEGINNERS", создана пользователем KingAlex, 7 авг 2024.

Метки:
  1. KingAlex

    KingAlex New Member

    Публикаций:
    0
    Регистрация:
    27 фев 2023
    Сообщения:
    3
    Здраствуте! Пытаюсь прочитать и понять что такое
    Код (ASM):
    1. test    eax, eax
    2. jbe     address
    или
    Код (ASM):
    1. test    eax, eax
    2. je     address
    и другие je, jae и т.д.
    Я понимаю если бы операнды были разные, но как может сработать это:
    Код (ASM):
    1. test    eax, eax
    2. jbe     address
    Тут что получается, они всегда равны и jbe всегда прыгает по адресу? Может ли такое быть что jbe не прыгнет по адресу?

    Понимаю если бы были одинаковые операнды, и использовались jz, jnz. Как eax может быть больше или меньше самого же eax?

    Еще объясните пожалуйста чем отличается cmp от test?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.994
    jbe (переход при CF=1 или ZF=1) в данном случае полностью идентично je (переход при ZF=1), потому что test гарантированно обнуляет CF. Связка test и je/jne (когда источник и приемник - один и тот же регистр) это сравнение регистра с нулем, просто на один байт дешевле, чем cmp и je/jne. А вообще test это проверка определенных бит поля по маске, но по прямому назначению эта инструкция используется редко.
     
    Mikl___ нравится это.
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    командапсевдокод и эквивалентFlags Affected
    cmp SRC1,SRC2TEMP = SRC1 − SignExtend(SRC2);
    ModifyStatusFlags;
    (* Modify status flags in the same manner as the SUB instruction *)
    The CF, OF, SF, ZF, AF, and PF flags are set according to the result
    push SRC1/sub SRC1,SRC2/pop SRC1
    test SRC1,SRC2TEMP = SRC1 AND SRC2;
    SF = MSB(TEMP);
    IF TEMP = 0
    THEN ZF = 1;​
    ELSE
    ZF = 0;​
    ENDIF
    PF = BitwiseXNOR (TEMP[0:7]);
    CF = OF = 0;
    (* AF is undefined *)
    The OF and CF flags are set to 0. The SF, ZF, and PF flags are set according to the result. The state of the AF flag is undefined
    push SRC1/and SRC1,SRC2/pop SRC1
     
    k3rnl и Win32Api нравится это.
  4. deletant

    deletant New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2023
    Сообщения:
    4
    KingAlex, Иногда могут быть еще бестолковые проверки для запутывания кода.
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    597
    Вот ещё,
    Код (ASM):
    1. .if (eax==edx) ;jnz
    2. .if (eax!=edx) ;jz
    3. .if (eax<edx) ;jnb
    4. .if (eax<=edx) ;ja
    5. .if (eax>edx) ;jbe
    6. .if (eax>=edx) ;jb
    7. .if (sdword ptr eax<edx)     ;jge
    8. .if (sdword ptr eax<=edx)  ;jg
    9. .if (sdword ptr eax>edx)     ;jle
    10. .if (sdword ptr eax>=edx)  ;jl
    11. nop
    12. .endif
    13. .endif
    14. .endif
    15. .endif
    16. .endif
    17. .endif
    18. .endif
    19. .endif
    20. .endif
    21. .endif
    всё таки высокоуровневый код рулит, UASM ещё поддерживает сравнения с xmm, масм так не умеет. Test это биты проверять, можно так .if (eax & 1000b)
     
  6. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    ymm, zmm умеет?