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:26] – sbel | faecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 17:55] (aktuell) – [Speicherbereiche reservieren] sbel | ||
---|---|---|---|
Zeile 8: | Zeile 8: | ||
* 16 Bit – 1 Wort (bei 80686 Prozessoren, | * 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 ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | + | {{ : |
- | | Write | 4 | unsigned int (Output Stream) | + | |
- | Das kann man sich ein wenig wie eine Funktion/Methode | + | 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 | ||
+ | |||
+ | 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-/Ausgabeoperationen verwendet. Es wird auch zusammen | ||
+ | |||
+ | ===== 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 | ||
+ | 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 ^ .bss ^ Size ^ | ||
+ | | db | resdb | 1 Byte | | ||
+ | | dw | resdw | 2 Byte | | ||
+ | | dd | resdd | 4 Byte | | ||
+ | | dq | resdq | 8 Byte | | ||
+ | |||
+ | **Beispiele: | ||
+ | |||
+ | * Zaehler2 DB 0 ;Def. der Byte-Variablen Zaehler2, Vorbesetzung mit 0 | ||
+ | * Startchar DB 65 ; | ||
+ | * Startchar DB ’A’; | ||
+ | * Regmaske DB 00110101b ; | ||
+ | * Pixely DW 01AFh ; | ||
+ | |||
+ | 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>: |