2010-06-06 16 views
5

Po użyciu IDA Pro demontować dll x86, znalazłem ten kod (Komentarze dodane przeze mnie w kodzie pusedo-c Mam nadzieję, że są one prawidłowe.):x86 jnz after 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 

zróbmy to prostsze dla mnie do zrozumienia :

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

W jaki sposób instrukcja warunkowego skoku działa po instrukcji XOR?

Odpowiedz

10

Podobnie jak w przypadku większości instrukcji, xor ustawia flagi warunków procesora w zależności od wyniku poprzedniej operacji. W takim przypadku flaga Z zostanie ustawiona, jeśli wynik xor wynosi zero. Instrukcja jnz testuje flagę Z i gałęzie, jeśli jest to zestaw , a nie.

+0

Dotyczy to również innych instrukcji logicznych? –

+0

@ kotarou3: Tak, flagi są ustawiane w wyniku prawie wszystkich operacji arytmetycznych i logicznych. –

3

Ledwo znać montaż w ogóle ale xor w tym kontekście nie całkiem tak samo jak cmp Powiedziałbym, oprócz ustawiania eax do wyniku operacji xor.

Innymi słowy, po xor, eax będzie 0 dokładnie, jeśli jego poprzednia wartość to d6h (w przeciwnym razie będzie to pewna wartość! = 0). I dodatkowo, flaga zero zostanie ustawiona (jak w przypadku cmp), dzięki czemu możesz jnz przetestować tę flagę.

3

Przeskoczy, jeśli wartość w eax nie skończy się jako zero.

Twój drugi przykład nie uwzględnia sprawiedliwości, ponieważ kod, który masz, używa stałych wartości, a nie wartości załadowanych z pamięci.

W pierwszym przykładzie ładuje wszystkie te wartości z pamięci i wykonuje na tym xor. Zawartość pamięci może, w przeciwieństwie do twojego drugiego przykładu, zmieniać się przy każdym wykonaniu w zależności od tego, co jest w [ebx+84h] i [esi+84h].

Aby uzyskać szczegółowe informacje, patrz: xor i jnz.

+0

Dzięki za linki, znalazłem tę stronę gdzieś, ale straciłem ją ponownie –

0

Operacje arytmetyczne, takie jak flagi porównania zestawów XOR (podobnie jak instrukcja porównania).

0

Cóż, JNZ jest skokiem warunkowym, w szczególności skokiem, jeśli nie jest zero.

XOR (i wiele innych operacji arytmetycznych/logicznych) ustawi flagę zerową rejestru stanu, jeśli wynik operacji wyniesie zero. Więc w twoim przypadku jest to powiedzenie "czy XOR, a jeśli wynik nie jest zerowy (tzn. Jeśli te dwie liczby są różne) przejdź do tej lokalizacji: