2012-03-20 13 views
6

Właśnie otworzyłem plik w IDA Pro i znalazłem kod, który wygląda zupełnie bezużytecznie. Jednak myślałem, że to może się przydać. Czy sub eax,0 po prostu nie odejmuje 0 od eax?sub eax, 0 - czy coś robi?

Kod:

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

Tak, odejmuje zero od eax. Ale to * robi * coś robi, ustawia flagi. Na przykład, jedyny sposób, w jaki spowoduje zero, to, że eax na początku był zero. – harold

Odpowiedz

13

Dyspozycja sub ustawia flagi (OF, SF, ZF, AF, PF i CF według documentation) - dyspozycja mov nie. jz przeskoczy tylko wtedy, gdy ustawiona zostanie flaga zerowa (ZF), więc jeśli chcesz skakać w oparciu o wartość w eax, ta flaga musi być odpowiednio ustawiona.

+0

Pomyślałem, że musisz użyć do tego instrukcji TEST. Dzięki! –

+1

'test' robi niejawne bitowe ORAZ, ale nie wpływa na wszystkie te same flagi. Z "testowych" dokumentów: "Flagi" OF "i" CF "są ustawione na" 0 ". Flagi' SF', 'ZF' i' PF' są ustawione zgodnie z wynikiem ... Stan flaga 'AF' jest niezdefiniowana." –

6

Instrukcja ustawi flagę zerową, jeśli jej wynik wynosi zero. W tym przypadku oznacza to, że flaga zerowa zostanie ustawiona, jeśli eax wynosi zero.

Te trzy instrukcje sprawdzają, czy [esp+fdwReason] ma wartość zero i przeskoczyć na loc_10001038 w takim przypadku.