2016-10-20 2 views
0

Ich versuche herauszufinden, ob der folgende Teil des Codes dem Assembler erlauben wird, zum Label 'dest' zu verzweigen.ARM Assembly Language: Wird diese bedingte Anweisung zur Bezeichnung "dest" verzweigen?

LDR R1, =value 
LDR R2, [R1] 
ADDS R2, R2, #200 
STR R2, [R1] 
BEQ dest 

Wo Wert zunächst enthält 0xFFFFFF38. Ich verstehe, dass das 's' am Ende der ADD-Anweisung den Dezimalwert 200 und R2 addiert und das Ergebnis auf R2 legt, während auch die APSR-Flags gesetzt werden, aber ich bin mir nicht sicher, was im BEQ verglichen wird Erklärung.

Danke.

Antwort

2

Viele Assemblersprachen haben eine BEQ -Typ-Instruktion, die oft eine Vergleichsbefehl wie folgt CMP (daher die „gleich“).

Aber, da ein Vergleich ist oft ein „subtrahieren, aber wegwerfen das Ergebnis“ verzweigen Betrieb BEQ wird einfach, wenn die Null Flag gesetzt ist.

Mit anderen Worten, was Sie neigen dazu, zu sehen sind Dinge wie (in einigen mythischen Pseudo-Assembler-Code):

; basically: for (reg1 = 0; reg1 != reg2; reg1++) 
    load reg1, 0 
startloop: 
    cmp reg1, reg2 ; pretend subtract reg1 - reg2 
    beq endloop  ; zero flag set means they were equal 
    : : 
    inc reg1 
    bra startloop 
endloop: 

Sie sind jedoch nicht beschränkt auf nur Vergleiche, alles, was die Sets entsprechende Fahne könnte verwendet werden, wie zum Beispiel:

load reg1, [memaddr] ; loading zero from memory 
    dec reg3    ; decrementing if we go 1 -> 0 

In Ihrem speziellen Fall, STR nicht wirklich die condi ändern tionsflags, es ist die ADDS, die den Zweig betrifft (in der Tat ist es das S Suffix, das dies seit einem regulären ADD nicht angibt).

Also, Endergebnis, wenn das Ergebnis Ihrer ADDS R2, R2, #200 (das Endergebnis in R2 platziert) ist Null, wird die Verzweigung genommen.

Das in der Tat der Fall sein wird, wenn der Anfangswert FFFFFF38h ist und fügen Sie 200 (C8h):

FFFFFF38 
     C8 + 
    -------- 
(1)00000000 =