Wann sollte carry flag in der Assemblersprache gesetzt werden?

8

Ich bin verwirrt über dieses Problem, wenn ich einen ARM-Assembly-Simulator in C schreibe. Ich habe einige ähnliche Fragen im Forum gefunden, aber keine von ihnen erklärt, wie man das Übertrags-Flag nur unter Verwendung der Beziehung zwischen zwei Operanden und der Ergebnis.

Jede Antwort wird begrüßt. Vielen Dank im Voraus.

Achtung.

    
Summer_More_More_Tea 18.05.2010, 07:30
quelle

4 Antworten

4

Sie müssen das Referenzhandbuch für den Prozessor überprüfen, um zu wissen, welche Anweisungen die Übertragsflags setzen und auf welche Weise. Ich weiß nicht genug über ARM, aber ich habe einige Variationen in anderen Prozessoren gesehen:

  • Einige Anweisungen, die logisch einen Übertrag generieren, dürfen das Übertragsflag

  • nicht festlegen
  • Einige Anweisungen können das Übertragsflag mit einem zusätzlichen impliziten Operanden oder Ergebnis verwenden, ohne eine Verbindung mit der Addition / Subtraktion zu haben

  • nach einer Subtraktion variieren die Prozessoren in welcher Bedingung das Carry-Flag gesetzt ist (dh einige tun es genauso wie nach der Addition eines invertierten zweiten Operanden, der andere setzt es auf die Negation) / p>

Wenn das, was Sie wollen, eine Möglichkeit ist, zu sehen, ob ein Übertrag für eine Addition in C generiert werden soll, gibt es zwei Möglichkeiten (die erste ist direkt aus der Definition, die zweite kommt aus dem Wrap-Around-Verhalten von unsigned):

%Vor%     
AProgrammer 18.05.2010, 07:58
quelle
6

Das Übertrags-Flag wird auf die normale Weise gesetzt, z. als Ergebnis einer Addition, die einen Übertrag erzeugt. Sie können dann einen Befehl ADC (add with carry) verwenden, um diesen Übertrag in ein Wort höherer Ordnung, z. wenn Sie ein 64-Bit-Addieren durchführen:

%Vor%

In diesem Beispiel ist der 64-Bit-Wert in r4: r5 gleich der Summe der 64-Bit-Werte in r0: r1 und r2: r3.

Bei frühen Versionen von ARM könnten Sie das Übertrags-Flag explizit wie folgt setzen:

%Vor%

oder wie folgt:

%Vor%

Siehe dieses Tutorial für weitere Informationen: Ссылка

Scheinbar neuere Versionen von ARM haben das Übertrags-Flag in ein anderes Register verschoben (siehe Kommentare unten).

    
Paul R 18.05.2010 07:36
quelle
3

schau dir den Armulator an, den du in den gdb Quellen findest. oder sehen Sie sich meinen Thumbulator thumbulator.blogspot.com an, ich kann nicht garantieren, dass er zu 100% debuggt.

Bei einem Addierer mit zwei Operanden können Sie anhand der Msbits der Operanden und des Ergebnisses feststellen, ob ein Übertrag vorhanden war. Oder Sie können einen experimentellen 8-Bit-Addierer schreiben und eine Wahrheitstabelle erstellen.

Ich weiß nicht, dass ich meinen ADC richtig habe, weil es ein drei Operanden add ist.

BEARBEITEN:

%Vor%

Was produziert:

%Vor%

Der offensichtliche Fall ist, wenn das Msbit des ersten Operanden und das Msbit des zweiten Operanden gesetzt sind, werden Sie dieses Bit übertragen. Die zwei weniger offensichtlichen Fälle sind, wenn das Msbit von a gesetzt ist und das Msbit des Ergebnisses nicht gesetzt ist, gab es einen Übertrag, ebenso wenn das Msbit von b gesetzt ist und das Msbit des Ergebnisses nicht gesetzt ist, gab es einen Übertrag .

Also

%Vor%     
old_timer 18.05.2010 19:21
quelle
3

Sehen Sie sich das ARM-Architektur-Referenzhandbuch (liebevoll als "ARM ARM" bezeichnet). Sie brauchen vielleicht einen Login in diesen Tagen, aber sie sind kostenlos (nur hinter einer Vereinbarung "Versprechen, uns nicht zu verklagen").

Die ARM-ARMs haben detaillierte Informationen darüber, wann das C-Bit für jede Anweisung in Pseudocode-Form gesetzt und gelöscht wird. Im ARMv5-ARM für ADCS haben Sie z. B.

%Vor%

... und sie decken sowohl die ARM- als auch die Thumb-Anweisung ab.

(Sie werden bemerken, dass fast alle arithmetischen Thumb-Modus-Anweisungen die Zustandscode-Flags einschließlich des Übertrags-Bits immer setzen; die ARM-Modus-Typen tun dies meistens nur, wenn sie das S-Flag gesetzt haben.)

(Meine Informationen sind möglicherweise auch nicht aktuell; ich kenne die ARMv5TE-Architektur am besten.)

    
leander 18.05.2010 20:06
quelle

Tags und Links