[ASM] Veta liken BR*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

[ASM] Veta liken BR*

Inlägg av Korken »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det bör framgå vilka status-bitar som varje branch instruktion
använder sig av. Sedan är det "bara" att välja den branch instruktione
som använder de bitar som man just då vill kolla. Och det beror ju
helt på vad man håller på med...
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

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...
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

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:

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
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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, jag tror jag har missförstått br instruktionerna.
Men nu förstår jag lite bättre. Tackar!

Jag måste nog också läsa mer om SREG så jag vet vilken flagga som sätts när vissa instruktioner körs.

//Emil
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Japp, har hittat det. :)

//Emil
Skriv svar