- Atmel
- MIPS
- Atmel
- MIPS
- Intel
sehr ähnlich sehen, das ist nur bedingt so.
Wir müssen zwei Generelle Parameter unterscheiden
- Die Addressierungsart
- Das Addressformat
MIPS
- Die Addressierungsart
- Registeraddressierung
- Direktwertaddressierung
- Unmittelbare Addressierung
- Indirekte Addressierung
- Indirekte Addressierung mit Autoinkrement/Dekrement
- Indirekte Addressierung mit Verschiebung
- Indizierte Addressierung
- Indizerte Addressierung mit Verschiebung
- Das Addressformat
- Dreiaddressformat
- Zweiaddressformat
- Einaddressformat
- Nulladdressformat
- Die Addressierungsart
- Registeraddressierung
- Direktwertaddressierung (Immidiate)
- Direkte Addressierung
- Indirekte Addressierung
- Indizierte Addressierung
- Das Addressformat
- Zweiaddressformat
- Einaddressformat
- Nulladdressformat
Üblicherweise heissen, die Allzweckregister bei einem Prozessor
Code: Alles auswählen
r0 bis r31
Code: Alles auswählen
$t0-$t9, $s0-$s7, $a0-$1, $v0-$vx, $gp, ...
Intel hat den Standard eingeführt
Code: Alles auswählen
ax
bx
dx
cx
sp
bp
si
di
es
cs
ds
ss
Code: Alles auswählen
add $t0, $t0, $t1
Code: Alles auswählen
add $t2, $t1, $t0
Code: Alles auswählen
add r0, r1
Code: Alles auswählen
add r0, r1
Code: Alles auswählen
add r0, r0, r1
Nicht ganz - aus der Sicht des Programmierers - also aus sicht der Instruction Set Architecture ist es verzeihbar. Allerdings ist ein Prozessor realisiert und implementiert in der Mikroarchitektur
Die Mikroarchitektur legt die Schaltung in der Realität fest
Ein 3-Address-Befehl, ein R-Typ befehl beim MIPS sieht aus wie
Code: Alles auswählen
add $t0, $t1, $t2
Ein R-Typ Befehl beim MIPS verfügt über die Felder
Code: Alles auswählen
rt, rs, rd
Doch diese Felder sind Felder im Binärcodierten Befehl. Und nein ein Binärcodierte Befehl wir nicht ähnlich einer Suchfunktion
Code: Alles auswählen
sed, grep
Der Befehl passt in das Format der Schaltung
Das ist der Unterschied
Nun möchte ich zum nächsten Thema übergehen. Die Architektur
Die überhaupt nicht irrelevant ist. Wir unterscheiden
- Die Lade- und Speicherarchitekur
- Die Register Speicherarchitektur
- Die Speicher Speicher Architektur
- Die Stack und Kellerarchitektur
- Die Akkumulatorarchitektur.
Tatsächlich benutzt Intel so etwas wie Syntaktischen Zucker, wobei das auch etwas genauer ein wenig anders sein könnte, nämlich den
Code: Alles auswählen
MOV
Dieser Befehl tut mehrere dinge gleichzeitig, was nicht immer üblich ist
Sehen wir das mal so
- Wir haben Register
- Wir haben Speicher
Wir können einen Befehl
von Register zur Register anwenden
von Speicher zu Register
von Register zu Speicher
von Speicher zu Speicher
Ersteres macht keinen Sinn. Einen Computer zu entwickeln, der keinen Arbeitsspeicher hat, ist ein anderes Modell. aber genau das bedienen wir normalerweise. Nämlich eine Lade und Speicherarchitektur
Der ADD-Befehl wird sinngemäss eigentlich nicht direkt auf den Arbeitsspeicher angewendet, sondern auf die Register
Code: Alles auswählen
add $r0, $r1, $r2
Das erledigen die Befehle
Code: Alles auswählen
LOAD
STORE
eine Register-Speicherarchitektur erwartet, dass der eine Opreand im Speicher ist, der andere in einem Register
Eine Speicher Speicherarchitektur, die höchst selten ist, benutzt den Arbeitsspeicher
Und eine Akkumulaturarchitektur tut das, was passieren würde, würden wir typischerweise eine Schaltung mit TTL 74xx aufbauen. Wir würden einen Addierer nehmen, oder gar eine ALU - daneben würden wir zwei Register nehmen
In unserem Operations und Steuerwerk Schaltplan, heissen diese A und B oder R0 und R1.
Dabei ist A oder R0, der Akkumulator. Wir würden eine reihe Berechnen. In R1 schreiben wir den Inkrement wert
Zum Beispiel 2
Code: Alles auswählen
2, 4, 6, 8, 10, 12, ...
Code: Alles auswählen
5, 7, 9, 11
Bleibt die Stack und Kellerarchitektur
Nun wir haben die Befehle
Code: Alles auswählen
PUSH und POP
Doch wie kann man so addieren. Das ist ganz einfach
Code: Alles auswählen
PUSH r0
PUSH r1
ADD
Das gibt es bei 8087 Intel, bei ATAM 862, Atmel, einer 4 Bit Architektur und der Java Virtual Machine
Gut - damit wäre fast alles geklärt. Nämlich folgendes, was ist
Code: Alles auswählen
LOAD and STORE
Code: Alles auswählen
MOV
LOAD kann man als ld bezeichnen
und STORE als st
Gut - MOVE ist bei den meisten Architekturen dafür vorgesehen
Code: Alles auswählen
move $r0, $r1
Gut - daneben müssen wir bedenken gibt es den Arbeitsspeicher, den RAM
Dieser nimmt eine Sonderrolle ein. Will ich etwas im Arbeitsspeicher speichern, dann handelt es sich dabei wie der Name sagt um einen
Code: Alles auswählen
STORE, store, st
Ich lade einen Wert aus dem Arbeitsspeicher in einem Register
Also von Register zu Arbeitsspeicher: Store
Und von Arbeitsspeicher zu Register: Load
Damit wären wir fast fertig. würden nicht die Addressierungarten bestehen. Intel verwendet für alles den MOV Befehl.
Demnach können wir schreiben
Code: Alles auswählen
MOV AX, BX ; Register-Register
MOV AX, 0xffff ; Registser Direktwert
MOV SI, OFFSET LABEL ; Feste Addresse im Arbeitsspeicher
MOV [BX], AX ; Addrese steht in BX
MOV DL, [BX+SI] ; Indirekte
- Registeraddressierung
- Immidiatewert - Direktwert
- Direkte Addressierung
- Indirekte Addressierung
- Indiziert
Nun hier übernimmt, bei Intel, der MOV Befehl alles.
Anders bei MIPS
Code: Alles auswählen
move
lb, lbu
lh, lhu
lw
ld
la
li
sb
sh
sw
sd
Code: Alles auswählen
0x1234
Das heisst, wir können ein Byte, ein Halbwort ein Wort oder Doppelwort bilden. Je nachdem wie viel in unserer Register $t0 bzw. allgemein $r0 passt. Nämlich oft 32 Bit oder 64, aber aber auch 16 oder 8 ist nicht unüblich
gut, anders beim Atmega8. hier haben wir
Code: Alles auswählen
ld, ldd, lds
Ich kenne die Befehle, aber so weit ich weiss, ist ldd indirekt, ld, direkt und lds - daneben gibt es vielleicht noch ldi für Immidiate Werte. Das können wir gleich üben und auch wieder auswendig lernen. Natürlich gibt es
Code: Alles auswählen
ld, ldd, lds, ldi
sd, sdd, sds, sdi
move
Code: Alles auswählen
PORTA, PORTB, PORTC, PORTD, PORTE
Sowohl der RAM, als auch die EA benutzen beim 8086er, denselben Addressbus, aber auch denselben Datenbus, vor allem
Das heisst, wird ausserhalb des 8086er in den RAM geschrieben, oder davon gelesen, wird der äussere (!) nicht einfach innere (!) Datenbus verwendet. Der befindet sich an den Pins. Damit schreibt er in den RAM oder liesst davon. Aber er benutzt das auch für die Hardware - wenn zum Beispiel Parallel in die Floppy Disk geschrieben wird. Gelöst wird das durch bausteine, auf dem IBM Mainboard. Und gewissen Pins an dem Prozessor. Es gibt einen INTR und ein INTA und ein INT - Pin - daneben gibt es den PC 8259 A, den Programmable Interrupt Controller.
Durch diesen und weitere Bausteine auf dem IBM Mainboard - zum Beispiel IBM 5126 beim 8088er und den Pins am 8088er bzw. 8086er wird festgelegt, wird der RAM beschrieben oder die Hardware.
Nur geht das alles auf dem externen Datenbus nach draussen
Das ist beim Atmega8 etwas anders. Natürlich lässt sich an PORTB ein RAM anschliessen. Trotzdem - ist ein RAM auf dem Chip des Mikrocontrollers. Die Ports
Code: Alles auswählen
PORTA, PORTB, ...
Wir dürfen das nicht verwechseln. Die Ports sind die EA. Vom Computer aus gesehen, während das LCD, was wir anschliessen, die LED's oder die Tastatur, das sind Geräte. Bestimmte Geräte. Intel löst das Problem dadurch dass an bestimmte Addressen geschrieben wird, die bei Intel Ports heissen, die eigentlich so gesehen für den RAM vorgeshen wären
Die Geräte sind die LED's. Und letzten Endes schicke ich über PORTB eine Zahl in Form einer Binärcodierten Zahl drauf. Natürlich steuere ich LCD anders an. Aber letzten Endes schicke ich Werte drauf
Gut, das ist das eine. Und was sollen nun die Angaben bei den Befehlen, im AVR Atmega8 Assembler Code
Code: Alles auswählen
ldi r16, 0xFF
out DDRD, r16
ldi r16, 0x00
out PORTD, r16
Das ist ganz einfach. Um den Port an zu sprechen, benutzen wir den Operanden in der Schreibweise
Code: Alles auswählen
PORTD, PORTB, PORTC usw
0xff drauf schicken, gehen alle aus. Wenn wir 0x00 drauf schicken, gehen sie alle an. Was wir wissen müssen, ist, dass es neben den übrigen Befehlen
Code: Alles auswählen
ld, lds, ldd
sd, sds, sdd
ldi
move
Code: Alles auswählen
in
und
out
Wir schreiben in einen Port mit:
Code: Alles auswählen
out PORTD, r16
Code: Alles auswählen
out DDRD, r16
Es gibt also diese Zwei Dinge
Code: Alles auswählen
PORTD und DDRD
Code: Alles auswählen
in
out
inout
Code: Alles auswählen
ldi r16, 0xFF
out DDRD, r16
Code: Alles auswählen
0b00011100
Gut, damit können wir anfangen