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:29] – sbel | faecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 17:55] (aktuell) – [Speicherbereiche reservieren] sbel | ||
---|---|---|---|
Zeile 20: | Zeile 20: | ||
Das folgende Bild zeigt die Register für die 32Bit Prozessoren: | Das folgende Bild zeigt die Register für die 32Bit Prozessoren: | ||
- | {{ : | + | {{ : |
Registernamen beginnen mit einem E für " | Registernamen beginnen mit einem E für " | ||
Zeile 32: | Zeile 32: | ||
Bei den aktuellen 64Bit Prozessoren gibt es die Register rax, rbx … die wiederum die eax, ebx Register „beinhalten“. | 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-/ | ||
- | <code asm> | + | ===== Flags ===== |
- | 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 | + | |
- | </ | ||
- | Hier kommt wieder der **Linux-Systemaufruf** '' | + | 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). |
- | * Lege die Nummer des Systemaufrufs in das EAX-Register | + | Sprechweise: |
- | * 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 Register erwartet, damit er funktioniert, | + | * „Flag gesetzt“ bedeutet Flag=1; auch „ein Flag setzen“ |
+ | * „Flag gelöscht“ bedeutet Flag=0; auch: „der Befehl löscht das Flag“ | ||
- | ^ Name ^ %eax ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | + | Es gibt zwei Gruppen von Flags: Statusflags und |
- | | Write | 4 | unsigned int (Output Stream) | + | Steuerflags. |
- | Das kann man sich ein wenig wie eine Funktion/Methode mit Argumenten vorstellen: Man befüllt zunächst | + | <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 | ||
+ | der Flags abhängig machen. | ||
+ | </WRAP> | ||
+ | |||
+ | [[.statusflags:start|Statusflags im Detail]] | ||
+ | |||
+ | ===== Speicherbereiche reservieren ===== | ||
+ | |||
+ | Im Abschnitt .data werden Speicherbereiche mit Vorbelegung definiert, im Abschnitt .bss solche, | ||
+ | |||
+ | 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>: |