Ich habe eine Frage zu einem PC-Register (IP in x86-Jargon). In den meisten Architekturen wird es während einer Ausführungsphase aktualisiert und speichert somit eine Adresse eines nächsten abzurufenden Befehls. Es schien mir klar, bis ich anfing, über eine Pipeline-Architektur nachzudenken. Stellen Sie sich zum Beispiel die folgende klassische RISC-Pipeline mit 5 Stufen vor (Abrufen, Decodieren, Ausführen, Speicherzugriff, Zurückschreiben), die mit den folgenden Anweisungen gefüllt ist (bezeichnet als „a“, „b“, „c“, „d“ ):
F D E M W
c b a - -
0x12 call [0x100] ; a
0x14 mov ax, 10 ; b
0x16 add ax, 2 ; c
0x18 nop ; d <- IP
Zu dem Zeitpunkt, zu dem ein Befehl "a" die Stufe E (Ausführen) in der Pipeline erreicht, ist sie bereits voll mit nachfolgenden Befehlen und IP zeigt auf einen Befehl an der Adresse 0x18 (der nächste, der abgerufen werden soll). Wenn "call [0x100]" ausgeführt wird, speichert es den Inhalt der IP (eine Rücksendeadresse) auf dem Stack. Aber es ist offensichtlich nicht die Adresse der Anweisung nach "call [0x100]"! Wenn wir also vom CALL zurückkehren, überspringen wir effektiv 2 Anweisungen, da die Pipeline während der CALL-Ausführung geleert wird!
Was bedeutet, dass:
Durchlesen des Referenzhandbuchs zur X86-Baugruppe ... https://courses.cs.washington.edu/courses/cse548/05wi/files/x86-reference-long.pdf
Sie finden Folgendes: „Die call-Anweisung ruft nahe Prozeduren mit einem vollständigen Zeiger auf. call bewirkt, dass die im Operanden genannte Prozedur ausgeführt wird. Wenn die aufgerufene Prozedur abgeschlossen ist, wird der Ausführungsfluss bei der Anweisung fortgesetzt, die der call-Anweisung folgt (siehe die Rücksendeanweisung)"
Dies sagt Ihnen, dass der Anruf zuerst zurückkommen muss. Dies bedeutet, dass bei der Ausführung noop-Anweisungen danach platziert werden, bis es zurückkehrt.
Unmittelbar nachdem dies aufgerufen wurde, bestimmt der Steuerblock, dass es sich um einen Anruf handelt, was ein Befehl ist, der eine Aktion durch die Gefahrenerkennungseinheit erfordert. Diese Einheit löst im Wesentlichen eine Anrufunterbrechung aus. Unmittelbar nach dem Sehen dieser Anweisung tritt dieser Interrupt auf, um noops aufzurufen, und lässt den PC nicht inkrementieren.
user_1818839