x86 jnz после xor?

После использования IDA Pro для дизассемблирования dll x86 я нашел этот код (комментарии добавлены мной в код 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?


person 小太郎    schedule 06.06.2010    source источник


Ответы (5)


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

person Greg Hewgill    schedule 06.06.2010
comment
Значит, это применимо и к другим логическим инструкциям? - person 小太郎; 07.06.2010
comment
@kotarou3: Да, флаги устанавливаются в результате почти всех арифметических и логических операций. - person Greg Hewgill; 07.06.2010

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

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

person Konrad Rudolph    schedule 06.06.2010

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

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

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

См. xor и jnz для получения подробной информации.

person paxdiablo    schedule 06.06.2010
comment
Спасибо за ссылки, я где-то нашла этот сайт, но опять потеряла. - person 小太郎; 06.06.2010

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

person James    schedule 06.06.2010

Ну, JNZ — это условный прыжок, точнее, прыжок, если не нулевой.

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

person Mahmoud Al-Qudsi    schedule 06.06.2010