wake-up-neo.com

ARM Assembler - Wie verwende ich CMP, BLT und BGT?

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
7
user1080390

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)
9
Leo

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.

1
omotto

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

0
Bo.