Het verschil tussen CMPL en CMP

Ik probeer de montage te begrijpen om een ​​puzzel op te lossen. Ik heb echter de volgende instructies tegengekomen:

0x0000000000401136 <+44>:    cmpl   $0x7,0x14(%rsp)
0x000000000040113b <+49>:    ja     0x401230 <phase_3+294>

Wat ik denk dat het doet is:
De waarde van 0x14(%rsp)is -7380. Volgens mijn begrip cmplvergelijkt niet-ondertekend. Ook wordt de sprong uitgevoerd.

Zo kan het zijn dat (unsigned)-7380 > 7– & GT; spring

Ik wil eigenlijk niet om het te springen. Maar is dit de juiste verklaring of niet? Ben ik aan het flippen van argumenten?

Ook als u advies hebt over het manipuleren van deze sprong!


Antwoord 1, Autoriteit 100%

Volgens mijn begrip cmplvergelijken niet-ondertekend.

het doet beide, op een bepaalde manier.

Het verschil in ondertekend versus Niet-ondertekend is hier het gebruik van de springinstructies.

Voor >, is er javoor Unsigned en jgvoor ondertekend (spring indien hierboven en spring indien groter).

Voor <, is er jbvoor Unsigned en jlvoor ondertekend (spring indien hieronder en spring indien minder).

Om precies te zijn, is hier de betekenis van verschillende jump-opdrachten:

voor niet-ondertekende vergelijkingen:

JB/JNAE (CF = 1)           : Jump if below/not above or equal
JAE/JNB (CF = 0)           : Jump if above or equal/not below
JBE/JNA (CF = 1 or ZF = 1) : Jump if below or equal/not above
JA/JNBE (CF = 0 and ZF = 0): Jump if above/not below or equal

Voor ondertekende vergelijkingen:

JL/JNGE (SF <> OF)          : Jump if less/not greater or equal
JGE/JNL (SF = OF)           : Jump if greater or equal/not less
JLE/JNG (ZF = 1 or SF <> OF): Jump if less or equal/not greater
JG/JNLE (ZF = 0 and SF = OF): Jump if greater/not less or equal

Antwoord 2, Autoriteit 10%

Gewoon om een ​​extra detail toe te voegen voor opheldering aan @ glglgl’s uitstekende antwoord is dat de “L” in “CMPL” een Operation Suffix geeft aan dat de bewerking wordt uitgevoerd op een lang aantal (32-bits geheel getal of 64-bits drijvend punt).


Antwoord 3

Ik denk niet dat X86 eigenlijk een instructie heeft genaamd cmpl. Het is waarschijnlijk een deel van de syntaxis van uw assembler om hints te geven op operanden of iets anders (zoals JZen JEhetzelfde is).

Vanaf de Intel-handleiding over wat het doet:

vergelijkt de eerste bronoperand met de tweede bronoperand en stelt de
Statusvlaggen in het EFLAGS-register volgens de resultaten. De vergelijking is
uitgevoerd door de tweede operand van de eerste operand af te trekken en vervolgens in te stellen
de statusvlaggen op dezelfde manier als de subinstructie. Wanneer een onmiddellijke
De waarde wordt gebruikt als een operand, het is sign-uitgebreid naar de lengte van de eerste operand.

NESSS wordt impliciet gegeven vanwege de aanvullende weergave van cijfers van de twee.

Hoe de sprong manipuleren? Als u er zeker van bent dat de sprong precies het tegenovergestelde zou moeten doen dan wat het doet, moet u gewoon jawijzigen op JBE.

Other episodes