Wie erfolgt der Registerzugriff im Falle einer X86-Architektur, wenn es nur In- und OUT-Befehle für Ports gibt?

In der ARM-Architektur werden die Register eines Peripheriegeräts dem RAM zugeordnet, sodass wir über das RAM auf die Register zugreifen können.

Was Sie fragen, ist der Unterschied zwischen Memory Mapped IO und IO Mapped IO. Beim Zugriff über IO-zugeordnetes IO wird eine Anweisung ausgegeben, Daten aus einem oder mehreren Universalregistern zu nehmen (ja, JEDER digitale IC hat heutzutage diese. Intel hatte früher 8, aber sie haben sie erhöht) und zu übertragen zu den richtigen Registern woanders. Der offensichtliche Nachteil besteht darin, dass dazu eine Anweisung erforderlich ist (was zu komplizierten Architekturen führt). Der offensichtliche Vorteil ist, dass Sie mehr Speicherplatz für RAM haben.

Antworten (2)

Zunächst einmal, um genau zu sein, können in einigen Mikrocontrollern Peripherieregister auf denselben Adressraum wie RAM abgebildet werden und erscheinen daher so, als ob sie sich im RAM befänden. Aber sie sind nicht physisch Teil des RAM. Dies wird als speicherabgebildete E/A bezeichnet und wurde erstmals in den 1970er Jahren von Motorola in Mikroprozessoren wie dem 6800, 6809 und 68000 verwendet.

Es kann also einen 16-KB-Block von Speicheradressen in einem Mikrocontroller geben, der bei 0x0000 beginnt, und die ersten 1 KB sind für E/A reserviert. Die E/A-Adressen würden von 0x0000 bis 0x03FF laufen und das RAM von 0x0800 bis 0x4000.

Wenn der RAM außerhalb des Chips wäre, also in diesem Beispiel wirklich ein 16-KByte-RAM vorhanden wäre, würden die ersten 1 KB des RAMs "verloren", da sie nicht adressiert werden könnten.

Der Nachteil von Memory-Mapped I/O ist also, dass es sich in den Adressraum des Prozessors „frisst“. Für kleine Mikrocontroller, die nur ein paar KB RAM-Adressraum haben, kann dies zu einem echten Problem werden.

In Mikrocontrollern, die Port-Adressierung verwenden, gibt es immer noch Peripherieregister, aber auf sie wird entweder durch IN- (Lesen) oder OUT- (Schreiben) Befehle zugegriffen. Jedes E/A-Register hat eine Portadresse, genau wie die Speicheradresse, die bei speicherabgebildeter E/A verwendet wird. Diese Adressen sind jedoch von den für RAM verwendeten Adressen getrennt. Sie können eine Speicheradresse 0x55 und eine Portadresse 0x55 haben und sich nicht gegenseitig stören.

Die Port-Adressierung wurde von Intel in den 1970er Jahren mit Mikroprozessoren wie dem 8008, 8080, 8085 und 8086 eingeführt. (Der 8051 hingegen verwendet speicherabgebildete E/A.)

Die 8080 und 8085 konnten beispielsweise nur 256 Ports (0x0000 bis 0x00FF) adressieren; das obere Byte der 16-Bit-Adresse wurde ignoriert. Der 8086 verwendete echte 16-Bit-Portadressierung und konnte theoretisch 65536 Portadressen adressieren.

Der Nachteil der Portadressierung mit den IN- und OUT-Anweisungen besteht darin, dass sie nur mit den AL- oder AX-Registern funktionierten und dann nur zum Laden oder Speichern aus den Registern. Beispielsweise könnten Sie mit der IN-Anweisung einen 8-Bit-Wert von einem Port in AL oder einen 16-Bit-Wert in AX lesen. Aber Sie konnten keine arithmetischen oder logischen Operationen ausführen, da der Wert aus dem Port gelesen wurde, wie Sie es mit Memory-Mapped I/O tun können.

Prozessoren, die eine Port-Adressierung verwenden, können auch eine speicherabgebildete E/A-Adressierung haben, vorausgesetzt, dass sich die RAM- und E/A-Peripheriegeräte außerhalb des Mikroprozessorchips befinden.

Bei der X86-Architektur können Peripherieregister RAM-Adressen oder E/A-Port-Adressen zugeordnet werden.

Die IN- und OUT-Anweisungen können viele E/A-Ports ansprechen - 256 beim 8085, wenn ich mich richtig erinnere - wahrscheinlich mehr beim X86.

Es bedeutet, dass nur 256 Register zugänglich sind?? Ist es nicht zu wenig
256 war viel im Jahr 1978!
@user3287223 "zu wenige"