Conditionele commando's
Arnout van Kempen over rommelen in een digitale wereld.
Je kunt geen zinvol programma schrijven als je geen voorwaardelijke acties hebt. In Rust werkte dat bijvoorbeeld via patern matching, in C met int max = (a > b) ? a : b;
De meeste CPU's, van de 8080, Z80 en 8086, tot de S/370 uit IBM's oude mainframes en de 6502 uit de Commodore 64, doen dit in de basis op dezelfde manier: een vergelijking tussen twee waardes, door deze van elkaar af te trekken, en dan een conditionele sprong. Bijvoorbeeld de 8086:
CMP AX, BX
JG label
Intern wordt nu AX-BX uitgevoerd zonder het resultaat op te slaan. De vlaggen Z en S geven nu het gewenste antwoord. Als AX=BX, dan is Z=1, immers de uitkomst is nul. Is AX>BX dan is Z=0 en S=1, want de uitkomst is negatief. (Dit is iets geabstraheerd voor de leesbaarheid.) De jumpinstructie betekent letterlijk Jump if Greater en is dus een jump die alleen onder die voorwaarde wordt uitgevoerd. Hiermee zijn beslissingen in een programma in te bouwen, we hebben een conditionele sprong. De Z80 heeft er een aantal die rechtstreeks aansluiten op de vlaggen, de 8086 heeft er nog veel meer en kan op allerlei combinaties van vlaggen testen.
Maar de ARM? Vorige keer hebben we geen conditionele sprongen besproken. Waarom niet?
De ARM koppelt het sprongmechanisme en de conditionele logica volledig los van elkaar. Hierdoor kan de conditionele logica aan vrijwel ieder commando worden gekoppeld. Sprongen, maar ook alle andere commando’s die we gezien hebben. Zo is
CMP X0, X1
B.EQ label
een prima instructie, zoals we die zouden verwachten: een compare en dan een conditionele sprong. En ook
CMP X0, X1
BL.EQ Subroutine
; Vervolg van het programma
Subroutine:
; Subroutine-code
RET
is prima. De call of, in ARM-termen, de Branch met Link, wordt alleen uitgevoerd als X0=X1. De 8086 kent deze mogelijkheid al niet. Maar helemaal aardig wordt het met
CMP X0, X1
ADD.EQ X2, X2, X3
Hier wordt X2=X2+X3 uitsluitend uitgevoerd als X0=X1. Dit is een vorm van conditionele uitvoering die buiten de ARM niet voorkomt bij de bekendere CPU's.
Welke condities kent de ARM nu:
Conditie Betekenis Voorwaarde (Vlaggen)
EQ Equal Z = 1
NE Not Equal Z = 0
GE Greater or Equal (signed) N == V
LT Less Than (signed) N != V
GT Greater Than (signed) Z = 0 en N == V
LE Less or Equal (signed) Z = 1 of N != V
CS/HS Carry Set/Uns. Higher/Same C = 1
CC/LO Carry Clear/Unsigned Lower C = 0
Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.
Gerelateerd

RISCy business
Arnout van Kempen over rommelen in een digitale wereld.

Basiscommando's
Arnout van Kempen over rommelen in een digitale wereld.

Automatiseren wat je kan
Arnout van Kempen over rommelen in een digitale wereld.

Vlagvertoon
Arnout van Kempen over rommelen in een digitale wereld.

Klein leed en moedig voorwaarts
Arnout van Kempen schrijft wekelijks over wat hij noemt "rommelen in een digitale wereld". Deze week alweer editie 100 van zijn 'nerd-rubriek' voor liefhebbers.