If-Anweisungen, und alle anderen Steuerablaufanweisungen sind auf der Logikebene als bedingte Sprünge implementiert.
Wenn Sie eine if-Anweisung, wie diese:
int a = 1, b = 0
if (a > b)
{
...
Offensichtlich jeder Smart-Compiler dies heraus optimieren. Wenn wir speziell unsere Compiler anweisen, so dumm wie möglich zu sein und Anweisungen wörtlich zu generieren, werden wir so etwas wie die folgenden aus ihm heraus:
my_if_statement:
CMP eax, ebx # intrinsically works by subtracting ebx from eax
# eax and ebx are not changed, but the arithmetic flags are
# if it was greater, jump to greater label
JG my_if_statement_was_true
# if it wasn't greater, we get here
my_if_statement_was_false:
# do something
# we're now done, so jump to the end of the statement
J my_if_statement_end
my_if_statement_was_true:
# do something else
# now we're done with the if statement
my_if_statement_end:
# program continues
Diese Montageanleitung sind, von denen jede (grob) werden direkt auf Maschinencode-Opcodes. Der Prozessor macht eine Menge zusätzlicher Dinge, um den Prozess des Ladens und Abrufens von Befehlen zu unterstützen, was hier relevant ist. Es gibt ein spezielles Register, das Programmzähler (später als PC-Register bezeichnet), das den Ort des nächsten Opcodes verfolgt, den der Prozessor ausführen wird.
- Zuerst subtrahiert der CMP-Befehl den zweiten Operanden vom ersten und verwirft das Ergebnis. Das FLAGS-Register wird jedoch mit den Ergebnissen der arithmetischen Operation aktualisiert.
- Dann prüft der JG-Befehl, ob das GREATER-Flag im FLAGS-Register gesetzt ist. Da es sich in unserem Beispiel um 1 handelt, rufen Sie einen Sprung auf.
- Der Sprungbefehl ändert den Programmzähler (PC), der das Register ist, von dem aus die CPU den nächsten Befehl liest.
- Die CPU versucht dann, den nächsten Befehl zu lesen. Da wir gesprungen sind, folgt die nächste Anweisung nicht unmittelbar auf die zuvor bearbeitete.
Das ist ein Überblick über den Prozess. Wenn Sie eine ausführlichere Erklärung wünschen, empfehle ich Ihnen, ein einfaches C-Programm mit einer if-Anweisung zu schreiben, zu kompilieren, zu disassemblieren (mit Linux objdump
oder einem Äquivalent) und vielleicht einen Debugger anzuhängen und auszuführen.
linux objdump
manual
die nächste Anweisung anzuzeigen, display/i $pc
Große Frage! komplizierte Antwort. Sie müssen sehen, dass es geschieht, um es vollständig zu verstehen, ich empfehle Ihnen, ein einfaches Beispiel zu schreiben, es zu kompilieren, es mit einem Debugger zu verbinden und es nacheinander zu lesen. – Wug
@wug das ist eine großartige Idee, danke. – Nealon