2010-06-06 6 views
5

После использования IDA Pro разобрать DLL x86, я нашел этот код (Комментарии, добавленные мной в pusedo-с кодом, я надеюсь, что они правы.):x86 jnz после xor?

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 

Lets сделать его проще для меня, чтобы понять, :

mov  eax, b3h 
xor  eax, d6h 
jnz  ... 

Как инструкция условного перехода работает после инструкции xor?

ответ

10

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

+0

Таким образом, это относится и к другим логическим инструкциям? –

+0

@ kotarou3: Да, флаги установлены в результате почти всех арифметических и логических операций. –

3

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

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

3

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

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

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

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

+0

Спасибо за ссылки, я нашел этот сайт где-то, но потерял его снова –

0

Арифметические операции, такие как xor set flags (как инструкция сравнения).

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^