Forum: Mikrocontroller und Digitale Elektronik Cortex M3 Assembler - Branch if Carry


von Max M. (maxmicr)


Lesenswert?

Simple Frage: Wie macht man in Cortex M3 Assembler einen Branch wenn das 
Carry-Flag gesetzt ist?

Ich hab mir das so überlegt:
1
    lsl r0,r0,1
2
    it  cc
3
    b   setLow
4
    b   setHigh

Hier findet man die verschiedenen Conditions 
(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABEHFEF.html), 
cc bedeutet, dass das Carry-Flag '0' ist, d.h. wenn C=0 dann wird 
"setLow" angesprungen, ansonsten wird der nächste Befehl übersprungen 
und "setHigh" wird angesprungen.
Ich bekomme allerdings die Fehlermeldung
1
Incorrect condition in IT block

von (prx) A. K. (prx)


Lesenswert?

BCS target

von Max M. (maxmicr)


Lesenswert?

A. K. schrieb:
> BCS target

Hm, entweder ich bin blind oder den Befehl BCS gibt es nicht?

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABJCCDH.html

Erkennt meine IDE auch nicht als Befehl.

von (prx) A. K. (prx)


Lesenswert?

Ebendort, 3.9.1: B{cond} label

"Bcond is the only conditional instruction that is not required to be 
inside an IT block."

von Max M. (maxmicr)


Lesenswert?

Okay, das wurde aber auch gut versteckt. Vielen Dank!

Beitrag #5158576 wurde von einem Moderator gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Dein obiger Code wäre korrekt, aber länger als ohne IT, mit:
    it  cc
    bcc setLow
    b   setHigh

So ein redundant anmutender IT Block wird erst wirklich verständlich, 
wenn man neben dem Thumb2 Befehlssatz auch den nativen ARM Befehlssatz 
kennt. ARM hatte die ASM-Notation im zweiten Anlauf so hingedeichselt, 
dass man für beide den gleichen Quellcode schreiben kann. Bei Thumb2 
sind die Bedingungen der Befehle im IT-Block irrelevant, bei ARM 
hingegen wird die Zeile mit dem IT-Befehl verworfen. Der Assembler 
schaut aber nach, ob es für beide Fälle stimmig ist.

Der erzeugte Code ist deshalb bei Thumb2
    it  cc
    b   setLow
    b   setHigh
und bei ARM
    bcc setLow
    b   setHigh

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.