x86 jnz после xor? - PullRequest
       18

x86 jnz после xor?

6 голосов
/ 06 июня 2010

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

Ответы [ 5 ]

11 голосов
/ 06 июня 2010

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

3 голосов
/ 06 июня 2010

Будет скачок, если значение в eax не будет равно нулю.

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

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

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

3 голосов
/ 06 июня 2010

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

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

0 голосов
/ 06 июня 2010

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

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

0 голосов
/ 06 июня 2010

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

...