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 18:30] sbelfaecher:informatik:oberstufe:techinf:assembler:register:start [13.09.2021 19: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 37: Zeile 37:
   * **DX** wird als das Datenregister bezeichnet. Es wird auch bei Eingabe-/Ausgabeoperationen verwendet. Es wird auch zusammen mit dem AX-Register und DX für Multiplikations- und Divisionsoperationen mit großen Werten verwendet.   * **DX** wird als das Datenregister bezeichnet. Es wird auch bei Eingabe-/Ausgabeoperationen verwendet. Es wird auch zusammen mit dem AX-Register und DX für Multiplikations- und Divisionsoperationen mit großen Werten verwendet.
  
 +===== Flags =====
  
-<code asm> 
-section .data 
-     msg db 'Displaying 9 stars',0xa ;Message, Aneinanderreihung von "byte" (db) Bereichen 
-     len equ $ - msg  ;Laenge der Message 
-     s2  times 9 db '*' ; 9 x ein byte (db) mit dem Inhalt "*" 
-  
-  
- 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>+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). 
  
-Hier kommt wieder der **Linux-Systemaufruf** ''4'' zum Einsatz. Linux-Systemaufrufe funktionieren grob folgendermaßen:+Sprechweise:
  
-    Lege die Nummer des Systemaufrufs in das EAX-Register +  „Flag gesetzt“ bedeutet Flag=1; auch „ein Flag setzen“  
-    Speichere die Argumente für den Systemaufruf in den Registern EBX, ECX, usw. +  „Flag gelöscht“ bedeutet Flag=0; auch: „der Befehl löscht das Flag“
-    * 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:+Es gibt zwei Gruppen von FlagsStatusflags und  
 +Steuerflags.
  
-^ Name   %eax  ^ %ebx                          ^ %ecx                    ^ %edx            ^ %esx  ^ %edi  ^ +<WRAP center round tip 60%> 
-| Write  | 4     | unsigned int (Output Stream)  | const char (Inhalte)  | size_t (Länge)  | -     | -     |+**Statusflags** sind Flags, die der Prozessor nach arithmetischen oder bitweise logischen Operationen setzt, um etwas über das Resultat dieser Operation auszusagen. 
  
-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.+Der Programmierer kann diese Flags dann in bedingten Sprungbefehlen abfragen und Programmverzweigungen vom Zustand 
 +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, 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 ;Vorbesetzung mit ASCII-Zeichen #65 = ’A’ 
 +  * Startchar DB ’A’;gleiche Wirkung, besser lesbar 
 +  * Regmaske DB 00110101b ;Vorbesetzung mit binärem Wert (Bitmuster) 
 +  * Pixely DW 01AFh ;Wort-Variable, Vorbesetzung mit hexadezimalem Wert 
 + 
 +Mit einer Anweisung können auch gleich mehrere Speicherplätze gleichen Typs, also Felder , 
 +definiert werden: 
 + 
 +  * 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 
 + 
 +Das haben wir beim Hallo-Welt Programm gemacht. 
 + 
 +In der .bss-Sektion sieht dass folgendermaßen aus: 
 + 
 +''antwort resb 5 ; 5 beschreibbare Bytes ohne spezielle Vorbelegung.''   
 + 
 +{{simplefilelist>:faecher:informatik:oberstufe:techinf:assembler:register:*}}
  • faecher/informatik/oberstufe/techinf/assembler/register/start.1631550634.txt.gz
  • Zuletzt geändert: 13.09.2021 18:30
  • von sbel