Pytanie:
Co robi instrukcja `TEST`
Marek
2017-04-19 02:12:07 UTC
view on stackexchange narkive permalink

Mam problem ze zrozumieniem instrukcji TEST i jej użycia. Patrzę na następujący kod na końcu pętli

  0040A3D1 A9 00010181 TEST EAX, 810101000040A3D6 74 E8 JE SHORT JinKu_ke.0040A3C0  

I rozumiem jak to działa TEST AL, AL czy TEXT EAX, EAX, ale nie wiem jak to działa z liczbami Bo instrukcja JE nie przeskakuje gdy używam 0x810100FE a także nawet gdy używamy 0x81010102, ale gdy używam 0x60E0FEFC i poniżej Skok instrukcji JE.

Jeden odpowiedź:
julian
2017-04-19 04:22:24 UTC
view on stackexchange narkive permalink

1. TEST

Zgodnie z pozycją x86 Instruction Set Reference dla TEST, którą można znaleźć pod adresem http://x86.renejeschke.de/,

TEST

[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/,

JE

[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).


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...