2016-05-14 13 views
-2

ich diesen Code zu konvertierende Prädizierter Anweisung Montag mitconvert c der Montage mit prädizierten Befehl

If (A>B){ 

    C=A; 
    D=B; 
    E=0 

} 

else{ 

    C=B; 
} 

Ist es richtig, oder wie kann ich springen benutzen?

cmp R1,R2; considering B is assigned to R2 and A assigned to R1 
movlf R3,R1;R3 assign to C 
mov R4,R2;R4 assign to D 
mov R5,0; R5 assign to E 
movlt R3,R2 
+4

Nach welcher Assemblersprache fragen Sie? – interjay

Antwort

7

WARNUNG: Antwort für Anfänger. Kann erfahrene Benutzer zu Tode bringen.


Ich bin nicht sicher, ob Sie die Terminologie missbraucht oder wenn Sie wollen wirklich predicated instructions verwenden.

Im letzteren Fall mit ARM v6 predication als Studie Fall (und Ihren Räumlichkeiten über Registerverwendungs ​​vererben), ist die Montage einfach

;r1 = A r2 = B r3 = C r4 = D r5 = E 
; 
;A, B unsigned   | ;A, B signed 
          | 
cmp r1, r2    | cmp r1, r2 
          | 
movhi r3, r1    | movgt r3, r1 
movhi r4, r2    | movgt r4, r2 
movhi r5, #0    | movgt r5, #0 
          | 
movls r3, r2    | movle r3, r2 

Hier habe ich zwei auf dem Schild der beteiligten Variablen basierten Versionen.

movhi bedeutet bewegen, wenn höher. movls bedeutet bewegen, wenn niedriger oder gleich.
movgt bedeutet bewegen, wenn größer. movle bedeutet bewegen, wenn weniger oder gleich.
Sie bedeuten den gleichen arithmetischen Vergleich, nur dass letzterer die richtigen Flags für vorzeichenbehaftete Zahlen verwendet.

gruppiert ich die Anweisungen, so ist es einfach, die if-then und die sonst Blöcke zu identifizieren.
Beachten Sie, wie Anweisungen im selben Block das gleiche Suffix haben (z. B. hi und ls).

Was diesen Code wirklich ein if-then-else Konstrukt und nicht als etwas anderes macht, ist die Tatsache, dass die Bedingungen hi-ls und gt-le sind sich gegenseitig ausschließende (nur eine der Zweier kann wahr sein) .
So nur ein Block von Anweisungen kann ausgeführt werden.

Die Verwendung sich nicht gegenseitig ausschließender Bedingungen führt zu mehreren if-then-else Aussagen.


Wenn Sie die Terminologie missbraucht und Sie wollten eigentlich nur eine bedingte Anweisung (oder Auswahl), dh ein if-then-else implementieren, dann ist die übliche Vorgehensweise ist eine bedingte Verzweigung als Nutan bereits gezeigt.
hier eine leicht lesbare Version:

cmp r1, r2 
bls _A_less_same_B 

mov r3, r1 
mov r4, r2 
eor r5, r5, r5 

b _end_if 

_A_less_same_B: 
mov r3, r2 

_end_if: 

Bis zu Ihnen die Last dieses Code zu konvertieren mit signierten Zahlen zu arbeiten.

Die schönen Worte mit einem Doppelpunkt (:) endet Etiketten, genannt werden, sind sie ein nützlicher Weg, um Punkte im Code zu nennen (und Daten) .
Denken Sie darüber nach wie flexible Zeilennummern.

b bedeutet Zweig, sobald es der nächste Befehl abgerufen wird, von dem Etikett ausgeführt wird (Adresse) als Operand angegeben (zum Beispiel von _end_if).
bls ist nur ein prädizierten b (bls bedeutet Zweig, wenn weniger oder gleiche), die gemeinhin als bedingte Verzweigung bekannt.

Bedingte Verzweigungen sind wie normale Verzweigungen, aber sie können "ignoriert" werden, wenn die angegebenen Bedingungen nicht erfüllt werden.
Ein bedingter Sprung soll genommen sein, wenn die Bedingungen erfüllt sind und die CPU den Sprung ausführen, wodurch die nächsten Anweisungen von dem als Operand angegebenen Label abgerufen werden.
Es wird gesagt, nicht genommen werden, wenn die Bedingungen nicht erfüllt sind und die CPU die Ausführung von der Anweisung nach der Zweig (das Programm fließen fallen durch) fortzusetzen.

Die "Bedingungen" bedeutet normalerweise Flags gesetzt und gelöscht. Einige Anweisungen, wie cmp, setzen und löschen diese Flags.
Andere Anweisungen, wie bls verwenden diese Flags.

Die Flags werden in einem dedizierten Register (ps in ARM) gehalten, aber es gibt Architekturen, vor allem MIPS, die kein Flags-Register haben.

Mit Ihrem Finger können Sie den Programmablauf simulieren. Zum Beispiel, wenn A > B ist die Strömung wie folgt:

      [Start Here] 
          ¯¯¯¯+¯¯¯¯¯ 
cmp r1, r2      | 
bls _A_less_same_B    + [Branch not taken, fall through] 
           | 
mov r3, r1      | 
mov r4, r2      | 
eor r5, r5, r5     | 
           | 
b _end_if      +--[Branch always taken]----+ 
                  | 
_A_less_same_B:            | 
mov r3, r2             | 
                  | 
_end_if:       +--[Land here]--------------+ 
           | 
           V 

Die Biegung ist, bedeutet einen „Sprung über“ den Code Bild, das wir (die sonst in diesem Fall) überspringen wollen.


Ich erkenne nicht die Assembler-Geschmack Ihrer Frage, so kann ich nicht helfen mit konkreten Beispielen zu schreiben.
Ich würde es trotzdem nicht tun, da ich denke, dass diese allgemeine Erklärung genug ist und in der Hoffnung, dass ein solcher Mangel an Anstrengung auf meiner Seite Sie dazu anregen wird, die Übung selbst zu lösen.

Dies ist ein obligatorischer Schritt auf dem Weg des Lernens.


Instruction, die abgerufen sind, decodiert (wahrscheinlich zu ausgestellt), aber nur dann ausgeführt, wenn bestimmte Flags gesetzt oder gelöscht ist.

Beachten Sie, dass die bedingten Verzweigungen möglichst vermieden werden sollten. Abhängig von der Mikroarchitektur des Targeting kann ein optimalerer Weg für das gleiche Ergebnis gefunden werden. Dies war nur erwähnenswert, kümmern Sie sich im Moment nicht darum.

Tatsächlich Offsets, die zu Adressen werden.

+4

Dies ist eine wirklich ausgezeichnete Antwort auf eine nicht so große Frage. Gut gemacht! –

+3

Auf ARM ist 'mov r5, # 0' eine bessere und effizientere Möglichkeit, ein Register auf Null zu setzen. Es fühlt sich komisch an, 'xor' nicht zu verwenden, aber das ist nur gut bei x86, wo die Instruktionscodierung mit variabler Länge bedeutet, dass das Vermeiden eines unmittelbaren Bytes tatsächlich Platz spart und als ein Nullsetzungs-Idiom erkannt wird. In ARM Thumb2-Maschinencode ist "eor r5, r5" ein 4B-Befehl, aber "mov r5, # 0" ist ein 2B-Befehl. Außerdem wird "eor" eine falsche Abhängigkeit von dem alten Wert haben, da es keinen Grund für eine ARM-Mikroarchitektur gibt, um einen speziellen Fall "eor same, selbe" wie ein Nullsetzungs-Idiom durchzuführen. –

+1

@PeterCordes Mein Instinkt sagte mir, dass es kein Null-Idiom gab, aber ich war zu faul, das zu überprüfen. Danke für die Bereitstellung, ich aktualisiere die Antwort. –