2016-11-12 3 views
1

ich zwei Möglichkeiten, wie der Carry-Flag encounted haben kann eingestellt werden:Wie funktionieren Subq und Cf zusammen?

0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00

(unterstreicht zeigen Bytes)

wenn tut dies durch Subtraktion, würden wir borgen müssen von einem bisschen haben wir nicht, was die CF auf 1 setzen sollte.

Allerdings hatte ich den Eindruck, dass ALUs nicht subtrahieren, sondern fügen Sie einfach das Zweierkomplement. das Zweierkomplement von 0x80_00_00_00_00_00_00_00 ist 0x80_00_00_00_00_00_00_00. so, 0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00 tragen keine Bits aus dem 63-Bit, das die CF auf 0

Welche dieser Situationen gilt für 64-Bit-Werte in x86 gesetzt würde?

Führt die ALU tatsächlich eine Subtraktion durch oder konvertiert sie in das Zweierkomplement und die umgewandelten Werte, um eine Subtraktion durchzuführen?

Dank

+2

Warum haben Sie es nicht versucht? x86 wird subtrahieren, so dass CF auf 1 gesetzt wird. Einige Architekturen verwenden tatsächlich CF für die Subtraktion umgekehrt. – Jester

+0

Ich bin mir nicht sicher, wie man das testet? Wie würde ich das Ergebnis sehen? Ich bin in einer Einführung in die Systemklasse; Alles ist in C. Ich kann die Demontage sehen, aber ich habe keine Ahnung, wie man die Statusregister sieht. Ich könnte wahrscheinlich etwas programmieren, um zu versuchen, was passiert ist, aber ich würde gerne wissen, wie man die Flaggen tatsächlich sieht. –

+0

Verwenden Sie einen Debugger. '(gdb) p $ eflags' ergibt' $ 1 = [CF PF SF IF OF] 'Auch wenn Sie in C codieren, warum interessieren Sie sich für Flags? Der Compiler kümmert sich um sie ... – Jester

Antwort

1

Siehe Understanding Carry vs. Overflow conditions/flags mehr über carry zu lernen.

Ja natürlich jede Implementierung von SUB muss immer noch das gleiche architektonisch sichtbare Verhalten beibehalten, einschließlich der Flag-Ergebnisse.

Es spielt keine Rolle, wie die ALU intern arbeitet, nur was die Ergebnisse sind, und Null Minus ungleich Null erzeugt einen Übertrag, also wird jede x86 CPU in dieser Situation CF setzen. Jede CPU, die das nicht tut, ist kein x86.

Siehe das Tag Wiki für Links zu Intels x86 Handbücher (und viele andere gute Links); Ich bin mir sicher, dass es irgendwo in den offiziellen Handbüchern einen Abschnitt zum Verhalten bei der Flaggensetzung gibt.

Verwandte Themen