Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 16:19] – [Tabelle] sbel | faecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 17:55] (aktuell) – [Speicherbereiche reservieren] sbel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Register und Speicherbereiche ====== | ====== Register und Speicherbereiche ====== | ||
+ | Ein Register ist eine Gruppe von Flipflops (1 Bit-Speicher) mit gemeinsamer Steuerung. Register umfassen meist 8, 16, 32 oder 64 Bit. | ||
+ | * 1 Bit – 1 Flag | ||
+ | * 4 Bit – 1 Nibble | ||
+ | * 8 Bit – 1 Byte | ||
+ | * 16 Bit – 1 Wort (bei 80686 Prozessoren, | ||
+ | {{ : | ||
- | <code asm> | + | Die Bits der Register sind numeriert, vom LSB (LeastSignificantBit) zum MSB (MostSignificantBit). |
- | section .data | + | |
- | msg db ' | + | |
- | len equ $ - msg ;Laenge der Message | + | |
- | | + | |
- | + | ||
- | + | ||
- | | + | |
- | global _start | + | |
- | + | ||
- | | + | |
- | mov edx, | + | |
- | mov ecx, | + | |
- | mov ebx,1 ;file descriptor (stdout) | + | |
- | mov eax,4 ;system call number (sys_write) | + | |
- | int 0x80 ;call kernel | + | |
- | + | ||
- | mov edx,9 ;message length | + | |
- | mov ecx, | + | |
- | mov ebx,1 ;file descriptor (stdout) | + | |
- | mov eax,4 ;system call number (sys_write) | + | |
- | int 0x80 ;call kernel | + | |
- | + | ||
- | mov eax,1 ;system call number (sys_exit) | + | |
- | int 0x80 ;call kernel | + | |
- | </ | + | ===== Die Register des 80x86 ===== |
- | Hier kommt wieder | + | 1985 kommt Intels 8086-Prozessor auf den Markt, |
- | * Lege die Nummer des Systemaufrufs in das EAX-Register | + | Auf dem Weg zu den heutigen x86 Prozessoren wurde diese Architektur stets erweitert – bis auf heute 64 Bit. |
- | * Speichere die Argumente für den Systemaufruf in den Registern EBX, ECX, usw. | + | |
- | * Rufe den Interrupt (80h) auf | + | |
- | * Das Ergebnis des Systemaufrufs wird normalerweise im EAX-Register zurückgegeben. | + | |
- | Um das erfolgreich zum Einsatz zu bringen, muss man wissen, was ein Systemaufruf in welchem | + | Das folgende Bild zeigt die Register |
- | ^ Name ^ %eax | + | {{ : |
- | | Write | 4 | + | |
+ | Registernamen beginnen mit einem E für " | ||
+ | |||
+ | Für diese acht Register gilt, dass jeweils die unteren 16 Bit unter dem Namen des früheren 16-Bit-Registers angesprochen werden können. | ||
+ | |||
+ | Damit haben die neueren Prozessoren stets alle Register ihrer Vorgänger, nutzen deren Fähigkeiten aber nicht aus. | ||
+ | |||
+ | Bei den vier Allzweckregistern EAX, EBX, ECX und EDX lassen sich die unteren 16 Bit als AX, BX, CX und DX ansprechen, und diese zusätzlich auch noch byteweise als AL und AH, BL und BH, CL und CH, DL und DH (L für „Low“, H für „High“). | ||
+ | |||
+ | Bei den aktuellen 64Bit Prozessoren gibt es die Register rax, rbx … die wiederum die eax, ebx Register „beinhalten“. | ||
+ | |||
+ | * **AX** ist der primäre Akkumulator; | ||
+ | * **BX** wird als Basisregister bezeichnet, da es bei der indizierten Adressierung verwendet werden kann. | ||
+ | * **CX** wird als Zählregister bezeichnet, da in den Registern ECX und CX die Schleifenanzahl bei iterativen Operationen gespeichert wird. | ||
+ | * **DX** wird als das Datenregister bezeichnet. Es wird auch bei Eingabe-/ | ||
+ | |||
+ | ===== Flags ===== | ||
+ | |||
+ | |||
+ | Das EFlag-Register unterscheidet sich von an den anderen Registern. Die Flipflops in diesen Registern werden einzeln gesteuert, jedes Flipflop hat eine bestimmte Bedeutung – es ist ein Flag (Flagge, Fähnchen). | ||
+ | |||
+ | Sprechweise: | ||
+ | |||
+ | * „Flag gesetzt“ bedeutet Flag=1; auch „ein Flag setzen“ | ||
+ | * „Flag gelöscht“ bedeutet Flag=0; auch: „der Befehl löscht das Flag“ | ||
+ | |||
+ | Es gibt zwei Gruppen von Flags: Statusflags und | ||
+ | Steuerflags. | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | **Statusflags** sind Flags, die der Prozessor nach arithmetischen oder bitweise logischen Operationen setzt, um etwas über das Resultat dieser Operation auszusagen. | ||
+ | |||
+ | Der Programmierer kann diese Flags dann in bedingten Sprungbefehlen abfragen und Programmverzweigungen vom Zustand | ||
+ | der Flags abhängig machen. | ||
+ | </ | ||
+ | |||
+ | [[.statusflags: | ||
+ | |||
+ | ===== Speicherbereiche reservieren ===== | ||
+ | |||
+ | Im Abschnitt .data werden Speicherbereiche mit Vorbelegung definiert, im Abschnitt .bss solche, die nicht initialisiert werden. | ||
+ | |||
+ | Bei der Deklaration muss angegeben werden, wie groß die Bereiche sein sollen. | ||
+ | |||
+ | ^ .data | ||
+ | | db | resdb | 1 Byte | | ||
+ | | dw | resdw | 2 Byte | | ||
+ | | dd | resdd | 4 Byte | | ||
+ | | dq | resdq | ||
+ | |||
+ | **Beispiele: | ||
+ | |||
+ | * Zaehler2 DB 0 ;Def. der Byte-Variablen Zaehler2, Vorbesetzung mit 0 | ||
+ | * Startchar DB 65 ; | ||
+ | * Startchar DB ’A’; | ||
+ | * Regmaske DB 00110101b ; | ||
+ | * Pixely DW 01AFh ;Wort-Variable, Vorbesetzung mit hexadezimalem Wert | ||
+ | |||
+ | Mit einer Anweisung können auch gleich mehrere Speicherplätze gleichen Typs, also Felder , | ||
+ | definiert werden: | ||
+ | |||
+ | * Meldung1 DB ’Divisionsfehler! ; | ||
+ | * Meldung1 DB ’Hallo Welt’, | ||
+ | |||
+ | Das haben wir beim Hallo-Welt Programm gemacht. | ||
+ | |||
+ | In der .bss-Sektion sieht dass folgendermaßen aus: | ||
+ | |||
+ | '' | ||
+ | |||
+ | {{simplefilelist>: |