[ASM] Veta liken BR*
[ASM] Veta liken BR*
Hej alla glada!
Nu har jag börjat med br* instruktionerna typ brne osv.
Men jag förstår inte logiken i den stora skaran med br* instruktionerna.
Jag har läst doc0856.pdf om de men förstår ändå inte när man ska använda vilken.
Finns det någon tumregel för dessa eller hur vet man vilken man ska använda?
Som ex vad som är lite konstigt är att man tex använder brne vid overflow vilket jag tycker är konstigt.
All hjälp är välkommen!
//Emil
Nu har jag börjat med br* instruktionerna typ brne osv.
Men jag förstår inte logiken i den stora skaran med br* instruktionerna.
Jag har läst doc0856.pdf om de men förstår ändå inte när man ska använda vilken.
Finns det någon tumregel för dessa eller hur vet man vilken man ska använda?
Som ex vad som är lite konstigt är att man tex använder brne vid overflow vilket jag tycker är konstigt.
All hjälp är välkommen!
//Emil
Korken, jag är inte riktigt med vad du menar med om det finns någon tumregel. Det beror ju på vad du försöker åstadkomma som bestämmer vad du ska använda för br* instruktion. Det är ju olika beroende på vad man vill att programmet ska göra.
Sedan förstår jag inte vad du menar att man ska använda brne vid overflow. Var står det?
"brne" - branch if not equal används ju för att genomföra ett hopp om Z flaggan är 0. Och den sätts till 0 om man gör en jämförelseinstruktion "cp" mellan två register som inte är lika.
Overflow är ju om något tal slår runt när man gör en beräkning. Då är det snarare overflow flaggan "V" som används. Och då är det ju brvs eller brvc som används istället...
Sedan förstår jag inte vad du menar att man ska använda brne vid overflow. Var står det?
"brne" - branch if not equal används ju för att genomföra ett hopp om Z flaggan är 0. Och den sätts till 0 om man gör en jämförelseinstruktion "cp" mellan två register som inte är lika.
Overflow är ju om något tal slår runt när man gör en beräkning. Då är det snarare overflow flaggan "V" som används. Och då är det ju brvs eller brvc som används istället...
Du måste förstå hur statusregistret fungerar i processorn. Där sitter massa bitar som sätts beroende på t.ex en logisk operations resultat.
Om du t.ex gör en subtraktion som "sub r13,r12" så sätts t.ex Z-flaggan i statusregistret om subtraktionen resulterar i 0. Din s.k. br-instruktion utför ett hopp beroende på hur t.ex Z flaggan är satt eller inte satt.
Om vi ponerar att R12 = 5 och R13 = 5 och du kör följande kod:
br står för "branch" som betyder ung. "hoppa" på svenska. Det vill säga att om vilkoret för din br-instruktion är sant, så hoppar programmet till det ställe du anger, annars fortsätter programmet med instruktionen direkt efter br-instruktionen.
Du väljer alltså br-instruktion beronde på vid vilket tillfälle du vill programmet skall hoppa.
breq FOO = hoppa till FOO om noll eller lika med, eller "if resultat = 0 then goto FOO"
brne FOO = hoppa till FOO om ej noll eller ej lika med, eller "if resultat <> 0 then goto FOO"
o.s.v.
Om du t.ex gör en subtraktion som "sub r13,r12" så sätts t.ex Z-flaggan i statusregistret om subtraktionen resulterar i 0. Din s.k. br-instruktion utför ett hopp beroende på hur t.ex Z flaggan är satt eller inte satt.
Om vi ponerar att R12 = 5 och R13 = 5 och du kör följande kod:
Kod: Markera allt
LOOP
sub r13,r12 ; IF (r13 - r12) = 0 THEN GOTO DET_BIDDE_NOLL
breq DET_BIDDE_NOLL ; Hoppa till DET_BIDDE_NOLL om r13 - r12 resulterar i noll, om resultatet *INTE* blir noll så fortsätter exekveringen med efterföljande instruktion (nedan)
jmp LOOP ; GOTO LOOP ;Om r13 - r12 *INTE* blir noll så hoppet oven *INTE* utfördes så utförs denna instruktion istället
DET_BIDDE_NOLL
; Hit hoppar programmet om ovanstående vart 0
Du väljer alltså br-instruktion beronde på vid vilket tillfälle du vill programmet skall hoppa.
breq FOO = hoppa till FOO om noll eller lika med, eller "if resultat = 0 then goto FOO"
brne FOO = hoppa till FOO om ej noll eller ej lika med, eller "if resultat <> 0 then goto FOO"
o.s.v.
Korken > Jag måste nog också läsa mer om SREG så jag vet vilken flagga som sätts när vissa instruktioner körs.
Det står ju detaljerat för varje instruktion i samma datablad du länkade till.
Under respektive instruktion i databladet är ju en bild på SREG och nedan en beskrivning hur H,S,V,N,Z,C flaggorna beter sig när instruktionen exekveras.
Bara att läsa innantill.
Det står ju detaljerat för varje instruktion i samma datablad du länkade till.
Under respektive instruktion i databladet är ju en bild på SREG och nedan en beskrivning hur H,S,V,N,Z,C flaggorna beter sig när instruktionen exekveras.
Bara att läsa innantill.