Здраствуте! Пытаюсь прочитать и понять что такое Код (ASM): test eax, eax jbe address или Код (ASM): test eax, eax je address и другие je, jae и т.д. Я понимаю если бы операнды были разные, но как может сработать это: Код (ASM): test eax, eax jbe address Тут что получается, они всегда равны и jbe всегда прыгает по адресу? Может ли такое быть что jbe не прыгнет по адресу? Понимаю если бы были одинаковые операнды, и использовались jz, jnz. Как eax может быть больше или меньше самого же eax? Еще объясните пожалуйста чем отличается cmp от test?
jbe (переход при CF=1 или ZF=1) в данном случае полностью идентично je (переход при ZF=1), потому что test гарантированно обнуляет CF. Связка test и je/jne (когда источник и приемник - один и тот же регистр) это сравнение регистра с нулем, просто на один байт дешевле, чем cmp и je/jne. А вообще test это проверка определенных бит поля по маске, но по прямому назначению эта инструкция используется редко.
командапсевдокод и эквивалентFlags Affectedcmp 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 resultpush SRC1/sub SRC1,SRC2/pop SRC1test 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 undefinedpush SRC1/and SRC1,SRC2/pop SRC1
Вот ещё, Код (ASM): .if (eax==edx) ;jnz .if (eax!=edx) ;jz .if (eax<edx) ;jnb .if (eax<=edx) ;ja .if (eax>edx) ;jbe .if (eax>=edx) ;jb .if (sdword ptr eax<edx) ;jge .if (sdword ptr eax<=edx) ;jg .if (sdword ptr eax>edx) ;jle .if (sdword ptr eax>=edx) ;jl nop .endif .endif .endif .endif .endif .endif .endif .endif .endif .endif всё таки высокоуровневый код рулит, UASM ещё поддерживает сравнения с xmm, масм так не умеет. Test это биты проверять, можно так .if (eax & 1000b)