Здравствуйте, скомпилировав инструкцию test reg,mem получил test mem,reg Например: Код (Text): format PE GUI 4.0 entry start segment 'code' code readable executable num1 dd 0 start: test edi,[num1] ret скомпиляет test dword [num1],edi Подскажите пожалуйста почему? Может быть дело в использовании edi?
Какая разница, что он там накомпилял? Ни mem, ни reg не меняются при этой операции, флаги устанавливаются одинаково, что test reg,mem, что test mem,reg Абсолютно идентичные по смыслу инструкции.
Потому что в кодировке инструкций x86 нет TEST r32, r/m32, есть только TEST r/m32, r32. Сравни: Код (Text): Инструкция SUB: 29 /r SUB r/m32, r32 2B /r SUB r32, r/m32 Инструкция TEST: 85 /r TEST r/m32, r32 TEST a, b эквивалентно TEST b, a, поэтому в x86 предусмотрен только один способ кодирования этой инструкции. С другой стороны, SUB a, b - это не то же самое, что SUB b, a. Поэтому для SUB есть два разных варианта. Из этого следует, что, как бы ты не написал (хоть test edi,[num], хоть test dword [num],edi), ассемблер все равно сгенерирует один код. Ну и соответственно, дизассеблер считает, что это одна и та же инструкция. Подробнее тебе объяснит The Svin; он на этом форуме главный спец по форматам инструкций .
10001111 Твой jc никогда не сработает. TEST его всегда в ноль ставит - ибо есть он по сути тот же AND без модификации приемника.