Assemblytaal je springfunctie

Ik probeer online het gebruik van de assembleertaalfunctie “je” te vinden. Ik heb gelezen dat je springt indien gelijk en dat is precies wat ik wil. Wat is het daadwerkelijke gebruik van deze functie, of met andere woorden, hoe typ ik deze functie om een waarde te controleren en spring als deze gelijk is aan iets?

Laat het me weten.

Trouwens, ik gebruik NASM als dat een verschil maakt.


Antwoord 1, autoriteit 100%

Stel dat u wilt controleren of EAXgelijk is aan 5en verschillende acties wilt uitvoeren op basis van het resultaat van die vergelijking. Een if-statement, met andere woorden.

 ; ... some code ...
  cmp eax, 5
  je .if_true
  ; Code to run if comparison is false goes here.
  jmp short .end_if
.if_true:
  ; Code to run if comparison is true goes here.
.end_if:
  ; ... some code ...

Antwoord 2, autoriteit 64%

Dit verspringt als de “equal flag” (ook bekend als de “zero flag”) in het FLAGSregister is ingesteld. Dit wordt ingesteld als resultaat van rekenkundige bewerkingen of instructies zoals testen cmp.

Bijvoorbeeld: (als het geheugen mij goed van pas komt, is dit correct 🙂

cmp eax, ebx ; Trek EBX af van EAX -- het resultaat wordt weggegooid
        ; maar het FLAGS-register wordt ingesteld op basis van het resultaat.
je .SomeLabel ; Spring naar een label als het resultaat nul is (d.w.z. ze zijn gelijk).
        ; Dit is ook dezelfde instructie als "jz".

Antwoord 3, autoriteit 55%

Ik moet zeggen dat je func is om te testen of de nulvlag is ingesteld en dan ergens anders heen te springen of door te gaan naar de volgende instructie die volgt.

test cx, cx
je   some_label

De testinstructie doet gewoon een bitsgewijze EN van de twee operanden en stelt de VLAG in volgens het EN-resultaat. De je-instructie gebruikt dan de ZERO-vlag om te beslissen om te springen of verder te gaan.

De bovenstaande code wordt gebruikt om te controleren of cx nul is of niet.

  • Als cx nul is, zal de test de nulvlag instellen, waarna je naar een plaats zal springen;
  • Als cx niet nul is, zal test geen nulvlag instellen, je zal doorgaan met het uitvoeren van de instructie die volgt.

OPMERKING: je moet niet gelijk testen, maar de ZERO-vlag testen die is ingesteld door een instructie daarvoor.


Antwoord 4, autoriteit 9%

Je laat het jemeestal voorafgaan door een cmp(of testof equivalent), die een vlag in het EFLAGS-register zet. Hier is een linknaar een eenvoudige echoserver in NASM die in het algemeen kan helpen. Negeer de irritante Google-advertenties.

Een voorbeeld van gebruik voor jekan zijn:

   cmp eax, ebx
    je  RET_FAIL
    jmp RET_SUCCESS
RET_FAIL:
    push 1
    pop  eax
    ret
RET_SUCCESS:
    push 0
    pop eax
    ret

Antwoord 5

Nou, ik heb eindelijk mijn antwoord gevonden. 😛 In principe bel je je label_to_jump_to na een cmp-aanroep.

Als cmp laat zien dat de twee waarden gelijk zijn, springt je naar het opgegeven label. Zo niet, dan blijft de uitvoering stromen.

Other episodes