После использования IDA Pro для разборки x86 dll я нашел этот код (Комментарии, добавленные мной в коде pusedo-c. Я надеюсь, что они корректны):
test ebx, ebx ; if (ebx == false)
jz short loc_6385A34B ; Jump to 0x6385a34b
mov eax, [ebx+84h] ; eax = *(ebx+0x84)
mov ecx, [esi+84h] ; ecx = *(esi+0x84)
mov al, [eax+30h] ; al = *(*(ebx+0x84)+0x30)
xor al, [ecx+30h] ; al = al XOR *(*(esi+0x84)+0x30)
jnz loc_6385A453
Позволяет делают это более простым, чтобы я понял:
mov eax, b3h
xor eax, d6h
jnz ...
Как команда условного перехода работает после xor инструкции?
Как и большинство инструкций, xor
устанавливает флаги состояния процессора в зависимости от результата предыдущей операции. В этом случае флаг Z будет установлен, если результат xor
равен нулю. Инструкция jnz
проверяет флаг Z и выполняет переход, если он не установлен .
Ну, JNZ - это условный переход, а именно переход, если он не равен нулю.
XOR (и многие другие арифметические / логические операции) установят нулевой флаг регистра состояния, если результат операции равен нулю. Итак, в вашем случае он говорит: «выполните XOR, и если результат не равен нулю (т.е. если два числа разные), перейдите в это место.
Я почти совсем не знаю ассемблер, но xor
в этом контексте делает практически то же самое, что и cmp
, я бы сказал, в дополнение к установке eax
в результат операции xor.
Другими словами, после xor
, eax
будет равен 0 именно в том случае, если его предыдущее значение было d6h
(иначе это будет некоторое значение != 0). И дополнительно, флаг нуля будет установлен (как и в случае cmp
), поэтому вы можете jnz
проверить этот флаг.
Он перепрыгнет, если значение в eax
не будет равно нулю.
Ваш второй пример не делает код справедливым, поскольку в вашем коде используются постоянные значения, а не значения, загруженные из памяти.
В первом примере все эти значения загружаются из памяти и выполняется xor
. Содержимое памяти может, в отличие от вашего второго примера, меняться при каждом выполнении в зависимости от того, что находится в [ebx+84h]
и [esi+84h]
.
Арифметические операции типа xor устанавливают флаги сравнения (как и инструкция сравнения).