Cmp-instructie begrijpen

Ik ben erg nieuw in assembleren en nu probeer ik te begrijpen hoe cmpwerkt. Dit is wat er staat geschreven in wiki:

cmp arg2, arg1

Voert een vergelijkingsbewerking uit tussen arg1 en arg2. De vergelijking
wordt uitgevoerd door een (ondertekende) aftrekking van arg2 van arg1, de resultaten
waarvan Temp. Temp wordt dan weggegooid.

Wat betekent het ‘Temp wordt dan weggegooid’? Waar wordt het opgeslagen? Hoe krijg ik toegang tot dit resultaat van de vergelijking? Kan iemand het uitleggen?


Antwoord 1, autoriteit 100%

cmp arg2, arg1voert dezelfde bewerking uit als sub arg2, arg1behalvedat geen van de operanden wordt gewijzigd. Het verschil wordt niet overalopgeslagen.

Het vlaggenregister isechter bijgewerkt en kan worden gebruikt in een voorwaardelijke sprong, zoals jump-if-equal (JE), meestal als de volgende instructie na de cmp.

Het voordeel ten opzichte van andere instructies is dat je twee waarden kunt vergelijken zonder ze te vernietigen. Als je sub arg2, arg1deed en ze zijn toevallig gelijk, dan zou een van hen daarna nul zijn. Met cmpzijn ze er allebei nog.


Antwoord 2, autoriteit 37%

de resultaten van CMP veranderen de waarden van ZF en CF, dit zijn enkele voorbeelden om heel veel CMP-instructies te begrijpen.

Voorbeeld 1: als AX < BX

MOV AX,5
MOV BX,8
CMP AX,BX 

Resultaat: ZF en CF ingesteld op ==> “ZF = 0” en “CF = 1”



Voorbeeld 2: als AX > BX

MOV AX,8
MOV BX,5
CMP AX,BX

Resultaat: ZF en CF ingesteld op ==> “ZF = 0” en “CF = 0”



Voorbeeld 3: als AX = BX

MOV AX,5
MOV BX,AX
CMP AX,BX 

Resultaat: ZF en CF ingesteld op ==> “ZF = 1” en “CF = 0”



ik hoop dat je begrijpt dat de resultaten van CMP de waarde van ZF en CF veranderen
ZF = Nulvlag
CF = Vlag dragen


Antwoord 3, autoriteit 26%

We gebruiken cmp arg2, arg1als het ons erom gaat of arg1 en arg 2 gelijk zijn. De processor bepaalt dit door arg2 van arg1 af te trekken en vervolgens naar het resultaat te kijken. Als het resultaat nul is (dat wil zeggen, arg1 = arg2), dan stelt de processor de nulvlag in (met “zet de vlag” bedoelen we dat hij deze op 1) zet. Omgekeerd, als het resultaat niet nul is (dat wil zeggen, arg1 != arg2), dan wist de processor de nulvlag (d.w.z. zet deze op 0). Het resultaat zelf wordt weggegooid, omdat het ons niet uitmaakt wat het is, alleen of het nul is of niet, wat we nu weten op basis van of de nulvlag is ingesteld. We kunnen dan instructies gebruiken zoals JE, JNE, JZen JNZdie de nulvlag onderzoeken en springen (of niet) op basis van zijn waarde. In het geval van JE(spring indien gelijk), zal de sprong plaatsvinden als de nulvlag is ingesteld, wat (zoals we hierboven hebben geleerd) zal zijn als de argumenten in de cmpwaren gelijk.


Antwoord 4, autoriteit 4%

Ik denk dat het erg laat is om een antwoord op deze vraag te plaatsen. Maar ik kan je een betere illustratie geven van hoe deze CMP-instructie werkt.

Als je twee argumenten vergelijkt met CMP arg1, arg2

CMP-instructies stellen statusvlaggen in op basis van de vergelijkingen tussen de argumenten.
Zie: wikipedia’s FLAGS-pagina

Het belang van CMP is meestal van toepassing in de uitvoering van de voorwaardelijke code (JUMP – Zie: montage_conditions ). Wanneer de processor een voorwaardelijke jump jccinstructie, controleert, De statusvlaggen registreren en springt naar het doeletiket als deze aan de voorwaarden voldoet, anders valt door naar de volgende instructie.

Other episodes