Kurze Frage an euch, in meiner Schleife muss ich CMP, BLT und BGT verwenden, um einige Werte zu vergleichen. Wie würden besagte Anweisungen in der folgenden Schleife verwendet?
Ich versuche, BGT, BLT und CMP so zu verwenden, wie ich sie benötige, damit meine Anwendung funktioniert. Das Problem ist, dass ich keine Ahnung habe, wie ich sie verwenden soll. 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 wollte, 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
Sie können keine bedingte Verzweigung durchführen, ohne zuerst das Bedingungsregister zu setzen. Dies kann mit cmp
oder durch Hinzufügen von s
zu den meisten Anweisungen erfolgen. Weitere Informationen finden Sie in der ARM Assembly-Dokumentation. Ein kurzes Beispiel:
Verzweigen, wenn r0
größer als 5 ist:
cmp r0, #5 ;Performs r0-5 and sets condition register
bgt label_foo ;Branches to label_foo if condition register is set to GT
Vergleiche r6
mit r4
, setze Differenz in r7
, verzweige 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)
Wenn ich CMP verwenden wollte, um r6 mit r4 zu vergleichen und die Differenz in r7 zu setzen, wie würde ich das tun?
subs r7, r6, r4 /* r7 ← r6 - r4 */
Die gleiche Frage, wenn ich BLT verwenden wollte, 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, das aktiviert wird, wenn das Ergebnis des Befehls eine negative Zahl ergibt. Sonst deaktiviert.
Warum subS statt sub? Da S ein optionales Suffix ist, werden die Bedingungsflags (wie N) beim Ergebnis der Operation aktualisiert.
Grüße.
Sie sollten die Dokumentation zu ARM unter (Beispiel für CMP-Dokumentation) auschecken: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHIDDID .html
Von dem, was dort zu lesen ist, was Sie zu tun versuchen, sind möglicherweise nicht nur eine, sondern zwei Anweisungen erforderlich (es sei denn, Ihr ARM Assembler führt eine spezielle Verarbeitung durch).
Mit freundlichen Grüßen,
Bo