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] – [Flags] 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 50: | Zeile 50: | ||
Steuerflags. | Steuerflags. | ||
- | Statusflags sind Flags, die der Prozessor nach arithmetischen oder bitweise logischen Operationen setzt, um etwas über das Resultat dieser Operation auszusagen. | + | <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 Programmierer kann diese Flags dann in bedingten Sprungbefehlen abfragen und Programmverzweigungen vom Zustand | ||
der Flags abhängig machen. | der Flags abhängig machen. | ||
+ | </ | ||
+ | [[.statusflags: | ||
- | ===== Beispiel | + | ===== 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. | ||
- | <code asm> | + | ^ .data |
- | section | + | | db | resdb | 1 Byte | |
- | msg db ' | + | | dw |
- | len equ $ - msg ;Laenge der Message | + | | dd | resdd | 4 Byte | |
- | s2 times 9 db ' | + | | dq |
- | + | ||
- | + | ||
- | | + | |
- | global _start | + | |
- | + | ||
- | | + | |
- | mov edx, | + | |
- | mov ecx, | + | |
- | mov ebx,1 ;file descriptor (stdout) | + | |
- | mov eax,4 ;system call number (sys_write) | + | |
- | | + | |
- | + | ||
- | mov edx,9 ;message length | + | |
- | mov ecx, | + | |
- | | + | |
- | mov eax,4 ;system call number (sys_write) | + | |
- | | + | |
- | + | ||
- | mov eax,1 ;system call number (sys_exit) | + | |
- | int 0x80 ;call kernel | + | |
- | </ | + | **Beispiele: |
- | Hier kommt wieder | + | * Zaehler2 DB 0 ;Def. der Byte-Variablen Zaehler2, Vorbesetzung mit 0 |
+ | | ||
+ | | ||
+ | | ||
+ | * Pixely DW 01AFh ;Wort-Variable, Vorbesetzung mit hexadezimalem Wert | ||
- | * Lege die Nummer des Systemaufrufs in das EAX-Register | + | Mit einer Anweisung können auch gleich mehrere Speicherplätze gleichen Typs, also Felder |
- | * Speichere die Argumente für den Systemaufruf in den Registern EBX, ECX, usw. | + | definiert werden: |
- | * 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, beim System-Call 4 (Write) ist es folgendermaßen: | + | * Meldung1 DB ’Divisionsfehler! ; |
+ | * Meldung1 DB ’Hallo Welt’,13,10 ; | ||
- | ^ Name ^ %eax ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | + | Das haben wir beim Hallo-Welt Programm gemacht. |
- | | Write | 4 | unsigned int (Output Stream) | + | |
- | Das kann man sich ein wenig wie eine Funktion/ | + | In der .bss-Sektion sieht dass folgendermaßen aus: |
+ | |||
+ | '' | ||
+ | |||
+ | {{simplefilelist>: |