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.
Nach welcher Assemblersprache fragen Sie? – interjay