x86 jnz после xor?

После использования 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 инструкции?

6
задан Brian Tompsett - 汤莱恩 25 June 2015 в 13:24
поделиться

5 ответов

Как и большинство инструкций, xor устанавливает флаги состояния процессора в зависимости от результата предыдущей операции. В этом случае флаг Z будет установлен, если результат xor равен нулю. Инструкция jnz проверяет флаг Z и выполняет переход, если он не установлен .

11
ответ дан 8 December 2019 в 13:44
поделиться

Ну, JNZ - это условный переход, а именно переход, если он не равен нулю.

XOR (и многие другие арифметические / логические операции) установят нулевой флаг регистра состояния, если результат операции равен нулю. Итак, в вашем случае он говорит: «выполните XOR, и если результат не равен нулю (т.е. если два числа разные), перейдите в это место.

0
ответ дан 8 December 2019 в 13:44
поделиться

Я почти совсем не знаю ассемблер, но xor в этом контексте делает практически то же самое, что и cmp, я бы сказал, в дополнение к установке eax в результат операции xor.

Другими словами, после xor, eax будет равен 0 именно в том случае, если его предыдущее значение было d6h (иначе это будет некоторое значение != 0). И дополнительно, флаг нуля будет установлен (как и в случае cmp), поэтому вы можете jnz проверить этот флаг.

3
ответ дан 8 December 2019 в 13:44
поделиться

Он перепрыгнет, если значение в eax не будет равно нулю.

Ваш второй пример не делает код справедливым, поскольку в вашем коде используются постоянные значения, а не значения, загруженные из памяти.

В первом примере все эти значения загружаются из памяти и выполняется xor. Содержимое памяти может, в отличие от вашего второго примера, меняться при каждом выполнении в зависимости от того, что находится в [ebx+84h] и [esi+84h].

Подробности см. в xor и jnz.

3
ответ дан 8 December 2019 в 13:44
поделиться

Арифметические операции типа xor устанавливают флаги сравнения (как и инструкция сравнения).

0
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: