2012-05-15 4 views
7

Schnelle Frage für Sie, in meiner Schleife muss ich CMP, BLT und BGT verwenden, um einige Werte zu vergleichen. Wie würden diese Anweisungen in der folgenden Schleife verwendet werden?ARM Assembler - Wie verwende ich CMP, BLT und BGT?

Ich versuche, BGT, BLT und CMP zu verwenden, wie ich sie brauche, um meine Anwendung arbeiten zu lassen. Das Problem ist, ich habe keine Ahnung, wie man sie benutzt. Wenn ich CMP verwenden wollte, um r6 mit r4 zu vergleichen und die Differenz in r7 zu setzen, wie würde ich das tun? Die gleiche Frage, wenn ich BLT verwenden möchte, wenn r7 kleiner als 0 ist, wie würde ich das tun?

BGT ??????? ; branch if greater than 5 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BGT ???????? ;branch if r7 is greater than 0 

Hier ist meine gesamte Schleife:

LoopStart 

    BL WaitBUT1 
    BL readTemp 
    BL checkTemp 
    BGT ??????? ; branch if greater than 5 
    BL errorVal 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BL FanOn 
    BL errorLedOn 
    BL systemLedOn 
    BL heaterOn 
    BGT ???????? ;branch if r7 is greater than 0 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 
    BL WaitBUT2 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 

    B LoopStart 
+0

Ihre Fragen sind unklar. Bitte klären Sie. –

+1

Ich habe eine weitere Beschreibung zu meiner Frage hinzugefügt. – user1080390

Antwort

9

Sie können eine bedingte Verzweigung nicht durchführen, ohne zuerst das Bedingungsregister zu setzen. Dies kann mit cmp oder durch Hinzufügen s zu den meisten Anweisungen erfolgen. Weitere Informationen finden Sie in der ARM-Assemblydokumentation. Schnell Beispiel:

Zweig wenn r0 größer als 5:

cmp r0, #5 ;Performs r0-5 and sets condition register 
bgt label_foo ;Branches to label_foo if condition register is set to GT 

Vergleichen r6 mit r4, legte Unterschied in r7, Zweig, wenn r7 < 0:

subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register 
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4) 
1

Wenn ich wollte benutze CMP um r6 mit r4 zu vergleichen und den Unterschied in r7 zu setzen, wie würde ich das machen?

subs r7, r6, r4 /* r7 ← r6 - r4 */ 

Die gleiche Frage, wenn ich wollte BLT verwenden, wenn r7 kleiner als 0 ist, wie würde ich das tun?

bmi _exit   /* branch if r7 < 0 */ 

BMI (minus/negativ) Wenn N aktiviert ist (N ist 1), wobei N ein Flag ist, der aktiviert wird, wenn das Ergebnis des Befehls eine negative Zahl ergibt. Ansonsten deaktiviert.

Warum subS statt sub? Da S ein optionales Suffix ist, werden die Bedingungsflags (wie N) beim Ergebnis der Operation aktualisiert.

Grüße.