faecher:informatik:oberstufe:techinf:assembler:register:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 16:36] – [Flags] sbelfaecher: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:
  
-{{ :faecher:informatik:oberstufe:techinf:assembler:register:auswahl_401.png |}}+{{ :faecher:informatik:oberstufe:techinf:assembler:register:auswahl_401.png?400 |}}
  
 Registernamen beginnen mit einem E für "extended", weil diese Register von 16 auf 32 Bit erweitert wurden.  Registernamen beginnen mit einem E für "extended", weil diese Register von 16 auf 32 Bit erweitert wurden. 
Zeile 59: Zeile 59:
 [[.statusflags:start|Statusflags im Detail]] [[.statusflags:start|Statusflags im Detail]]
  
 +===== Speicherbereiche reservieren =====
  
 +Im Abschnitt .data werden Speicherbereiche mit Vorbelegung definiert, im Abschnitt .bss solche, die nicht initialisiert werden.
  
-===== Beispiel =====+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:**
  
-<code asm> +  * Zaehler2 DB 0 ;Defder Byte-Variablen Zaehler2Vorbesetzung mit 0 
-section .data +  * Startchar DB 65 ;Vorbesetzung mit ASCII-Zeichen #65 = ’A’ 
-     msg db 'Displaying 9 stars',0xa ;Message, Aneinanderreihung von "byte" (db) Bereichen +  * Startchar DB ’A’;gleiche Wirkungbesser lesbar 
-     len equ $ - msg  ;Laenge der Message +  * Regmaske DB 00110101b ;Vorbesetzung mit binärem Wert (Bitmuster
-     s2  times 9 db '*9 x ein byte (db) mit dem Inhalt "*" +  * Pixely DW 01AFh ;Wort-VariableVorbesetzung mit hexadezimalem Wert
-  +
-  +
- section .text +
-    global _start     ;must be declared for linker +
-  +
- _start:          ;startadresse +
-    mov  edx,len  ;Laenge nach edx +
-    mov  ecx,msg  ;Message nach 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,s2   ;message to write +
-    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>+Mit einer Anweisung können auch gleich mehrere Speicherplätze gleichen Typs, also Felder , 
 +definiert werden:
  
-Hier kommt wieder der **Linux-Systemaufruf** ''4'' zum Einsatz. Linux-Systemaufrufe funktionieren grob folgendermaßen:+  Meldung1 DB ’Divisionsfehler! ;Vorbesetzung mit einer Zeichenkette,das Feld erhält 16 Byte Speicherplatz 
 +  Meldung1 DB ’Hallo Welt’,13,10 ;Vorbesetzung mit einer Zeichenkette, und Steuerzeichen, 12 Byte Speicherplatz
  
-    * Lege die Nummer des Systemaufrufs in das EAX-Register +Das haben wir beim Hallo-Welt Programm gemacht.
-    * 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, beim System-Call 4 (Write) ist es folgendermaßen:+In der .bss-Sektion sieht dass folgendermaßen aus:
  
-^ Name   ^ %eax  ^ %ebx                          ^ %ecx                    ^ %edx            ^ %esx  ^ %edi  ^ +''antwort resb 5 ; 5 beschreibbare Bytes ohne spezielle Vorbelegung.''  
-| Write  | 4     | unsigned int (Output Stream)  | const char * (Inhalte)  | size_t (Länge)  | -     | -     |+
  
-Das kann man sich ein wenig wie eine Funktion/Methode mit Argumenten vorstellenMan befüllt zunächst die Register mit den Argumenten und ruft dann den Systemaufruf auf.+{{simplefilelist>:faecher:informatik:oberstufe:techinf:assembler:register:*}}
  • faecher/informatik/oberstufe/techinf/assembler/register/start.1631550995.txt.gz
  • Zuletzt geändert: 13.09.2021 16:36
  • von sbel