Het testpunt %eax %eax [duplicaat]

Mogelijk duplicaat:
x86 Montage – testl eax tegen eax?

Ik ben heel erg nieuw in het programmeren in assembler en ik probeer momenteel de assembleertaal te lezen die is gegenereerd op basis van een binair bestand. Ik ben

. tegengekomen

 test   %eax,%eax

of test %rdi, %rdi, enz. enz. Ik ben erg in de war over wat dit doet. Zijn de waarden in %eax, %eax niet hetzelfde? Wat is het aan het testen? Ik heb ergens gelezen dat het de bewerking AND doet…..maar aangezien ze dezelfde waarde hebben, zou het dan niet gewoon %eax retourneren?

Het volgende is slechts één geval waarin ik dit gebruik vond:

   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>

Ik dacht dat JE springt als de twee waarden die worden vergeleken gelijk zijn……nou, want %eax is goed, zelf, in welke situatie zouden we NIET springen?

Ik ben een beginner op het gebied van programmeren in het algemeen, dus ik zou het erg op prijs stellen als iemand me dit zou kunnen uitleggen. Bedankt!


Antwoord 1, autoriteit 100%

CMP trekt de operanden af ​​en stelt de vlaggen in. Het stelt namelijk de nulvlag in als het verschil nul is (operanden zijn gelijk).

test stelt de nulvlag in, ZF, wanneer het resultaat van de AND-bewerking nul is. Als twee operanden gelijk zijn, is hun bitsgewijze AND nul wanneer beide nul zijn. test stelt ook de tekenvlag in, SF, wanneer de meest significante bit in het resultaat wordt gezet, en de pariteitsvlag, PF, wanneer de aantal ingestelde bits is even.

JE [Jump if Equals] test de nulvlag en springt als de vlag is ingesteld. JE is een alias van jz [Jump if Zero], dus de disassembler kan er geen selecteren op basis van de opcode. JE wordt zo genoemd omdat de nulvlag is ingesteld als de argumenten voor CMP gelijk zijn.

Dus,

TEST %eax, %eax
JE   400e77 <phase_1+0x23>

springt als de %eax nul is.


Antwoord 2, autoriteit 28%

Sommige x86-instructies zijn ontworpen om de inhoud van de operanden (registers) te laten zoals ze zijn en alleen specifieke interne CPU-vlaggen in of uit te schakelen, zoals de zero-flag (ZF). Je kunt bij de ZF denken als een waar/onwaar booleaanse vlag die zich in de CPU bevindt.

in dit specifieke geval voert de TEST-instructie een bitsgewijze logische AND uit, negeert het werkelijke resultaat en stelt de ZF in/uit volgens het resultaat van de logische en: als het resultaat nul is, stelt het ZF = 1 in, anders stelt het ZF = 0 in.

Voorwaardelijke spronginstructies zoals JE zijn ontworpen om naar de ZF te kijken voor springen/niet springen, dus het gebruik van TEST en JE samen is gelijk aan het uitvoeren van een voorwaardelijke sprong op basis van de waarde van een specifiek register:

voorbeeld:

TEST EAX,EAX
JE some_address

de CPU springt naar “some_address” als en slechts als ZF = 1, met andere woorden als en slechts als AND(EAX,EAX) = 0 wat op zijn beurt kan gebeuren als en slechts als EAX == 0

de equivalente C-code is:

if(eax == 0)
{
    goto some_address
}

Antwoord 3, autoriteit 7%

Dit controleert of EAX nul is. De instructie test doet bitsgewijze AND tussen de argumenten, en als EAX nul bevat, stelt het resultaat de ZF of ZeroFlag in.


Antwoord 4, autoriteit 2%

Je hebt gelijk, dat test “en” de twee operanden zijn. Maar het resultaat wordt weggegooid, het enige dat overblijft, en dat is het belangrijkste, zijn de vlaggen. Ze zijn ingesteld en dat is de reden waarom de instructie test wordt gebruikt (en bestaat).

JE springt niet als het gelijk is (het heeft de betekenis wanneer de instructie ervoor een vergelijking was), wat het echt doet, het springt als de ZF vlag is gezet. En aangezien het een van de vlaggen is die is ingesteld door test, heeft deze instructiereeks (test x,x; je…) de betekenis dat er wordt gesprongen als x 0 is.

Voor dit soort vragen (en voor meer details) kan ik je een boek aanraden over x86-instructies, b.v. zelfs als het erg groot is, is de Intel-documentatie erg goed en nauwkeurig.


Antwoord 5, autoriteit 2%

test is een niet-destructieve AND, het geeft niet het resultaat van de operatie terug, maar het stelt het vlaggenregister dienovereenkomstig in. Om te weten waar het echt op test, moet je de volgende instructie(s) controleren. Vaak wordt out gebruikt om een ​​register op 0 te controleren, eventueel in combinatie met een jz voorwaardelijke sprong.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes