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:31] – 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 47: | Zeile 47: | ||
* „Flag gelöscht“ bedeutet Flag=0; auch: „der Befehl löscht das Flag“ | * „Flag gelöscht“ bedeutet Flag=0; auch: „der Befehl löscht das Flag“ | ||
- | <code asm> | + | Es gibt zwei Gruppen |
- | section .data | + | Steuerflags. |
- | 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 | + | |
- | </code> | + | <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. | ||
- | Hier kommt wieder | + | Der Programmierer kann diese Flags dann in bedingten Sprungbefehlen abfragen und Programmverzweigungen vom Zustand |
+ | der Flags abhängig machen. | ||
+ | </ | ||
- | * Lege die Nummer des Systemaufrufs in das EAX-Register | + | [[.statusflags: |
- | * Speichere die Argumente für den Systemaufruf in den Registern EBX, ECX, usw. | + | |
- | * Rufe den Interrupt (80h) auf | + | |
- | * Das Ergebnis des Systemaufrufs wird normalerweise | + | |
- | Um das erfolgreich zum Einsatz zu bringen, muss man wissen, was ein Systemaufruf in welchem Register erwartet, damit er funktioniert, | + | ===== Speicherbereiche reservieren ===== |
- | ^ Name ^ %eax ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | + | Im Abschnitt .data werden Speicherbereiche mit Vorbelegung definiert, im Abschnitt .bss solche, die nicht initialisiert werden. |
- | | Write | 4 | unsigned int (Output Stream) | + | |
- | Das kann man sich ein wenig wie eine Funktion/ | + | Bei der Deklaration muss angegeben werden, |
+ | |||
+ | ^ .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 | ||
+ | * 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>: |