Statusflag - Befehl ADC?

3 Antworten

Ich kenne diesen Prozessor nicht, versuche das aber trotzdem zu erklären. (könnte ein ARM sein)

Das Carry stammt aus einer vorangegangenen Addition.

Es handelt sich offensichtlich um einen 32-Bit-Prozessor. Wenn man jetzt 64-Bit-Zahlen addieren möchte, muss man die Additionen "kaskadieren".

Wenn die niederwertigen 32 Bits der Summanden in R1 und R3 und die höherwertigen in R2 und R4 stehen, rechnet man:

ADD R10,R1,R3

Damit steht der niederwertige Teil der Summe in R10. Wenn ein Überlauf auftrat, wird Carry gesetzt, damit er bei der folgenden Addition berücksichtigt wird:

ADC R11,R2,R4

Damit steht der höherwertige Teil der Summe in R11.

Da du fragt, *wie* ein Carry zur Summe addiert werden soll, und nicht *warum*, nehme ich an, dass dir der Grund für das Addieren, wie in den anderen Antworten beschrieben, schon deutlich ist.

Zum wie: Die CPU kennt verschiedene Instruktionen zum Addieren. Eine, welche beim Addieren das Carry flag ignoriert und lediglich zwei Operanden addiert - diese könnte "ADD" heißen -, und eine andere, die sowohl die beiden Operanden, und zusätzlich noch eine 1 dazu, wenn das Carry flag gesetzt ist - das ist dann ADC, Add with Carry.

Die Wahl der entsprechenden Addier-instruktion macht den Unterschied.

Woher ich das weiß:Berufserfahrung – hard meets soft

Der genannte Befehl gehört wohl in den Befehlssatz der gängigen ARM-Processoren. Es geht um ganzzahlige Addition mit Übertrag und anschließender Aktualisierung der Flags N, Z, C und V [Der vierte Buchstabe 'S' des Befehls sagt und, dass die Flags zu aktualisieren sind.]

Bei der Aufgabe rechnest du den Übertrag hinzu, weil es verlangt wird. So einfach ist das. Die Aufgabe hat den Zweck, zu prüfen, ob du das kannst.

Bei der Addition der in der Aufgabe angegebenen konstanten Werte erhältst du einen Überlauf, der nach der vollständigen Ausführung des Additionsbefehls in das Flag c eingetragen wird. Beim Hinzuzählen des Werts von C wird sich der Wert des Flags N (negative) und V (Overflow im Zweierkomplement) auf 1 gesetzt, falls C ursprünglich den Wert 1 hatte, andernfalls nehmen N und V den Wert 0 an. Die Aufgabe ist im übrigen nur vollständig, wenn auch klar ist, welchen Wert das Flag C vor dem Aufruf des Befehls ADCS hat. Veremutlich steht das in einem Aufgabenteil, en du nicht mitgeteilt hast. Noch ein Hinweis zu den Flags: Die neuen Werte der Flags, die sich aus der Ausführung des Befehls ergeben, werden natürlich erst gesetzt, nachdem der Befehl mit den alten Werten der Flags vollständig ausgeführt wurde.

Unabhängig von der Aufgabe hat das ganzzahlige Addieren mit Übertrag natürlich paraktische Bedeutung. Wenn du auf einem 32-bit-Prozessor Ganzzahlen in 64-bittiger Darstellung addieren willst, zerlegst du die 64-bit-Zahlen in 32-bit-Zahlen. Du addierst dann erst den low-value-part (ohne Übertrag, aber mit Aktualisierung der Flags) und danach den high-value-part mit Übertrag und ggf. mit Aktualisierung der Flags. Das kann man auch mit noch längeren Ganzzahlen machen: Die Addition von zwei 128-bit-Zahlen verlangt vier Additionsbefehle: Einen ohne Berücksichtigung des Übertrags und danach drei weitere mit Übertrag.

DAs Rechnen mit sehr langen Ganzzahlen braucht man gelegentlich in der Kryptographie und natürlich auch oft in der Computeralgebra.

Hier ein Link, der die relevanten Befehle der ARM-Prozessoren zusammenfasst und unter der Überschrift "multiword arithmetic examples" auch Beispiele für das Rechnen mit langen Zahlen enthält: https://developer.arm.com/documentation/dui0068/b/ARM-Instruction-Reference/ARM-general-data-processing-instructions/ADD--SUB--RSB--ADC--SBC--and-RSC

Zum Schluss eine Bitte: Wenn es um Assembler-Programmierung geht, sollte in Fragen immer angegeben werden, von welchem Prozessor die Rede ist. Es ist nämlich nicht immer ganz einfach, das zu erraten oder aus einem einzigen Beispiel herauszulesen.

Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler