wake-up-neo.com

Was ist der Zweck von CS- und IP-Registern in der Intel 8086-Baugruppe?

Wie also die Frage lautet, was ist der Zweck von CS und IP in Intels 8086?

Ich habe diese Erklärung gefunden:

Das Codesegment (CS) ist ein 16-Bit-Register, das die Adresse eines 64-KB-Segments mit Prozessor .__ enthält. Anleitung. Der Prozessor verwendet das CS-Segment für alle Zugriffe auf Anweisungen, auf die mit .__ verwiesen wird. Befehlszeigerregister (IP-Register). CS-Register kann nicht direkt geändert werden. Das CS-Register wird während des Weitsprungs, des Weitanrufs und des Weitrückbefehls automatisch aktualisiert.

und das für IP:

Anweisungszeiger (IP) ist ein 16-Bit-Register.

Ich verstehe nicht wirklich, was dies im Wesentlichen bedeutet. Wenn also jemand eine "lebendigere" Erklärung geben könnte, wäre das großartig :)

20
idjuradj

Da der Instruction Pointer (IP) aus 16 Bit besteht, können Sie nur 64k-Anweisungen (2 ^ 16) verwenden, was in den 80er Jahren nicht viel war. Um den Adressraum zu erweitern, haben Sie ein zweites Register, das 64k-Blöcke adressiert. Sie könnten cs: ip zusammen als ein 32-Bit-Register betrachten, das dann in der Lage ist, 2 ^ 32 Bytes zu adressieren ... dh 4G. Der 8086 verwendete 20 Bit Adressen, sodass Sie auf 1 MB Speicher zugreifen konnten.

16
user1666959

Die physikalische Adresse wird aus 2 Teilen berechnet. i) Segmentadresse . ii) Offsetadresse ..__ Das CS (Codesegmentregister) wird verwendet, um das Codesegment des Speichers zu adressieren, d. Der IP (Instruction Pointer) enthält den Offset innerhalb des Codesegments des Speichers. Daher wird CS: IP verwendet, um auf den Ort (d. H. Zur Berechnung der physikalischen Adresse) des Codes im Speicher zu zeigen.

23
kiran james

Die Anweisung, die als nächstes ausgeführt wird, ist diejenige an der Speicheradresse, die gleich ist:

16 * CS + IP

Dies ermöglicht, dass 20 Bits Speicher adressiert werden können, obwohl Register nur 16 Bit breit sind (und es werden auch zwei verschiedene Arten der Kodierung der meisten Adressen geschaffen).

Die Wirkung von CS ist analog zu der der anderen Segmentregister. Zum Beispiel erhöht DS Datenzugriffe (die kein anderes Segmentregister angeben) um 16 * DS.

CS

Die Anweisungen, die CS ändern, sind:

  • ljmp (Weitsprung)
  • lcall (far call), der ip and cs an den Stack schiebt und dann weit springt
  • lref (Fernrückkehr), der den Fernruf umkehrt
  • int, das IP/CS aus der Interrupt-Vektortabelle liest
  • iret, die ein int umkehren

CS kann von mov nicht wie die anderen Segmentregister geändert werden. Beim Versuch, es mit der Standardkennung für CS zu kodieren, was GNU GAS 2.24 ohne Beanstandung tut, wenn Sie Folgendes schreiben:

mov %ax, %cs

führt bei Ausführung zu einer ungültigen Code-Ausnahme.

Um den Effekt von CS zu beobachten, fügen Sie einem Bootsektor Folgendes hinzu und führen Sie ihn in QEMU aus, wie hier erläutert. https://stackoverflow.com/a/32483545/895245

/* $1 is the new CS, $1f the new IP. */
ljmp $1, $after1
after1:
/* Skip 16 bytes to make up for the CS == 1. */
.skip 0x10
mov %cs, %ax
/* cs == 1 */

ljmp $2, $after2
after2:
.skip 0x20
mov %cs, %ax
/* cs == 2 */

IP

IP erhöht sich automatisch, wenn eine Anweisung um die Länge der Kodierung dieser Anweisung ausgeführt wird. Deshalb bewegt sich das Programm vorwärts!

IP wird durch die gleichen Anweisungen geändert, die CS modifizieren, und auch durch die nicht weit verbreiteten Versionen dieser Anweisungen (häufiger).

IP kann nicht direkt beobachtet werden, daher ist es schwieriger, damit zu spielen. Prüfen Sie diese Frage nach Alternativen: Programmzähler direkt lesen

da der 8086-Prozessor eine Adressierung von 20 Bits verwendet, können wir auf 1 MB Speicher zugreifen, aber die Register von 8086 sind nur 16 Bits. Um auf die Daten aus dem Speicher zuzugreifen, kombinieren wir die Werte, die in Codesegmentregistern und Anweisungszeigerregistern vorhanden sind, um a zu erzeugen Bei der physischen Adresse wird der Wert von CS um 4 Bits nach links verschoben und mit dem Wert IP addiert 

BEISPIEL:

wert von CS ist 1234Hex (hexadezimal)

der Wert von IP ist 5678Hex

jetzt ist der Wert von CS nach dem Verschieben von 4 Bits nach links 12340Hex, nach dem Hinzufügen mit dem IP-Wert ist dies 179B8Hex, was die physikalische Adresse ist

1
Amrish Ak

Wenn Sie .code in den Text Ihres Assembly-Programms schreiben, zeigt dieser .code auf den cs-Wert. Jeder Befehl, der sich später oder früher in der Datei befindet, wird über cs: ip angesprochen, wobei ip ein Versatzwert von cs ist.

Natürlich müssen Sie berücksichtigen, dass der Assembly-Compiler den Text zuerst in Maschinencode-Anweisungen konvertiert.

1
zeimer

IP-Register - IP ist Anweisungszeiger. Seine Funktion ist dieselbe wie bei einem PC (Programmzähler) in einem anderen Mikroprozessor, der auf den nächsten Befehl zeigt, der von der BIU-Einheit abgerufen werden soll, um in die EU-Einheit eingespeist zu werden.

0
masood qazi