1. TEST
Zgodnie z pozycją x86 Instruction Set Reference dla TEST, którą można znaleźć pod adresem http://x86.renejeschke.de/,
[TEST] oblicza bitowe logiczne AND pierwszego operandu (operand źródłowy 1) i drugiego operandu (operand źródłowy 2) i ustawia flagi stanu SF, ZF i PF zgodnie z wynikiem. Wynik jest następnie odrzucany.
Bardziej zwięźle:
AND imm32 z EAX; ustaw SF, ZF, PF zgodnie z wynikiem.
Jeszcze bardziej zwięźle:
instrukcja AND bez przechowywania wyniku
Więc dla
0040A3D1 A9 00010181 TEST EAX, 81010100
wartość w EAX
i 81010100
są połączone operatorem AND.
Jeśli wartość w EAX
to 0x810100FE
, operacja wygląda następująco:
EAX: 100000010000000100000000111111100x81010100: AND 10000001000000010000000100000000 ------------------------------------ 0x81010000: 10000001000000010000000000000000
Wynik, 81010000
, nie jest 0, więc flaga zero nie jest ustawiona.
Jeśli wartość w EAX
to 0x60E0FEFC
operacja wygląda następująco:
EAX: 011000001110000011111110111111000x81010100: AND 10000001000000010000000100000000 ------------------------- ----------- 00000000000000000000000000000000
Tutaj wynikiem jest 0, więc flaga zera (ZF) jest ustawiona na 1.
2. JE
Zgodnie z wpisem x86 Instruction Set Reference dla JE, który można znaleźć pod adresem http://x86.renejeschke.de/,
[JCC] sprawdza stan jednej lub więcej flag stanu w rejestrze EFLAGS (CF, OF, PF, SF i ZF) i, jeśli flagi są w określonym stanie (warunek), wykonuje skok do instrukcji docelowej określonej przez operand docelowy. Kod warunku (cc) jest powiązany z każdą instrukcją, aby wskazać testowany warunek. Jeśli warunek nie jest spełniony, skok nie jest wykonywany i wykonanie jest kontynuowane zgodnie z instrukcją następującą po instrukcji Jcc.
Szczególnie w przypadku 'JE'
Skocz krótko, jeśli równe (ZF = 1).
Do operacji
0040A3D1 A9 00010181 TEST EAX, 81010100
-
jeśli wartość w EAX
to 0x81010102
, flaga zera (ZF) nie jest ustawiana (patrz wyżej), więc przepływ kontroli nie rozgałęzia się tutaj .
-
jeśli wartość w EAX
to 0x60E0FEFC
, flaga zera (ZF) jest ustawiana na 1 (patrz wyżej ). W rezultacie przepływ gałęzi kontrolnych w tym miejscu (skoki EIP).
Podsumowanie
-
TEST
działa jak AND
, ale wyniki operacji nie są zapisywane. Ustawiane są tylko flagi PF, SF i ZF. - flaga zera (ZF) jest ustawiana na 1, jeśli wyniki operacji arytmetycznej lub logicznej (takiej jak
TEST
) wynoszą 0 . -
JE
powoduje, że EIP
przeskakuje, jeśli ZF = 1. - jeśli wartość w
EAX
to 0x81010102
, flaga zera (ZF) nie jest ustawiana, więc przepływ sterowania nie rozgałęzia się tutaj. - jeśli wartość w
EAX
wynosi 0x60E0FEFC
, flaga zera (ZF) jest ustawiona na 1. W rezultacie przepływ gałęzi sterowania w tym punkcie (skoki EIP).