faecher:informatik:oberstufe:techinf:assembler:adressierung: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:adressierung:start [20.09.2021 17:24] – [Unmittelbare Adressierung] sbelfaecher:informatik:oberstufe:techinf:assembler:adressierung:start [21.09.2021 07:01] (aktuell) sbel
Zeile 3: Zeile 3:
  
 Mit der Einführung des i80386 standen 32-Bit-Register zur Verfügung. Mit einem 32-Bit-Zeiger Mit der Einführung des i80386 standen 32-Bit-Register zur Verfügung. Mit einem 32-Bit-Zeiger
-kann man 23^2 = 4GB Speicher adressieren. Der im Register abgelegte Wert ist also eine Speicher**adresse** im Hauptspeicher. +kann man 23^2 = 4GB Speicher adressieren. Jede Adresse wird durch einen einzigen 32-Bit-Wert beschrieben, den 32-Bit-**Offset**. 
 ===== Adressierungsarten ===== ===== Adressierungsarten =====
  
Zeile 13: Zeile 12:
  
 Beispiele: Beispiele:
-<code>+<code asm>
 MOV BX,9               ; 9 wird unmittelbar ins Register bx geschrieben MOV BX,9               ; 9 wird unmittelbar ins Register bx geschrieben
 BYTE_VALUE  DB  150    ; Ein Byte-Wert (BYTE_VALUE) wird zum Wert 150 definiert  BYTE_VALUE  DB  150    ; Ein Byte-Wert (BYTE_VALUE) wird zum Wert 150 definiert 
 ADD  BYTE_VALUE, 65    ; Es wird unmittelbar der Wert 65 addiert ADD  BYTE_VALUE, 65    ; Es wird unmittelbar der Wert 65 addiert
-MOV  AX, 45H           ; 45H wird unmittelbar ins Register AX geshrieben+MOV  AX, 45H           ; 45H wird unmittelbar ins Register AX geschrieben
 </code> </code>
  
Zeile 25: Zeile 24:
    
 Beispiele: Beispiele:
-<code>+<code asm>
 MOV EAX, EBX  MOV EAX, EBX
 +</code>
 +
 +==== Direkte Speicheradressierung ====
 +
 +Bei der direkten Speicheradressierung wird der Offset des adressierten Speicherplatzes direkt angegeben und liegt nach der Assemblierung fest. Die Angabe des Offsets kann als konstante
 +Zahl oder (besser) als Variablenname erfolgen. Der Variablenname kann – muss aber nicht – in
 +eckigen Klammern eingeschlossen sein. Es können auch Feldelemente direkt adressiert werden,
 +indem nach dem Feldnamen ein Pluszeichen und eine Konstante folgen. 
 +
 +Beispiele:
 +
 +<code asm>
 +MOV AX, Zaehler1 ;Direkte Adressierung ohne eckige Klammern
 +MOV [bigcount],ECX ;Direkte Adressierung mit eckigen Klammern
 +MOV ECX, [Feld+2] ;Direkte Adr. von Feld + 2 Byte
 +</code>
 +
 +==== Indirekte Speicheradressierung ====
 +
 +Die direkte Adressierung reicht nicht mehr aus, wenn die Adresse der Speicherzelle erst zur Laufzeit bestimmt wird. Das kommt z.B. bei Feldern häufig vor. 
 +
 +Nehmen wir z.B. folgende Aufgabenstellung:
 +Für eine Zeichenkette soll die Häufigkeit der darin vorkommenden Zeichen bestimmt werden. Man braucht ein weiteres Feld um die Häufigkeit jedes Zeichens abzuspeichern. Bei der Bestimmung der Häufigkeit muss für jedes erkannte Zeichen der dazu gehörende Häufigkeitszähler um eins erhöht werden. Auf welchen Speicherplatz zugegriffen wird, ergibt sich also erst zur Laufzeit und hängt von den Daten ab. 
 +Eine direkte Adressierung, wie z.B. 
 +<code asm>
 +inc [Haufigkeit+5]
 +</code>
 +
 +reicht nicht aus. Ebenso liegt der Fall bei der Programmierung von Sortieralgorithmen und vielen anderen Problemstellungen der Informatik.
 +
 +Bei dem Problem der Häufigkeitsbestimmung wäre nach den Deklararationen
 +
 +<code asm>
 +Zeichenkette DB 'ABCDEfGH' 
 +Haeufigkeit times 26 DB 0
 +</code>
 +
 +im Codesegment eine direkte Adressierung wie z.B.
 +<code asm>
 +INC [Haeufigkeit+3]
 +</code>
 +
 +nicht zweckmäßig, sie würde immer das Feldelement 3 (das vierte) ansprechen. Man müßte statt der 3 etwas Variables einsetzen können, je nachdem für welchen Buchstaben man den Zähler inkremetieren möchte.
 +
 +Genau dies erlaubt die Register-indirekte Adressierung oder kurz indirekte Adressierung:
 +
 +<code asm>
 +MOV BX, 3 ;Vorbereitung
 +INC [Haeufigkeit+BX] ;indirekte Adressierung
 +</code>
 +wird nun auch das Feldelement 3 angesprochen, hier kann man aber zur Laufzeit berechnen, welcher Speicherplatz angesprochen werden soll, indem man BX mit diesem Wert vorbelegt, kann dann auch der 4. oder 10. Platz angesprochen werden.
 + 
 +
 +Die indirekte Adressierung bietet die Möglichkeit, den Offset zur Laufzeit flexibel zu berechnen, und zwar als Summe aus dem Inhalt eines Basisregisters (BX oder BP), dem eines Indexregisters (DI oder SI) und beliebig vielen Konstanten. Die Konstanten können auch Variablennamen sein.
 +Die allgemeine Form der indirekten Adressierung in ist:
 +
 +**[Basisregister + Indexregister + Konstanten]**
 +
 +Es dürfen auch ein oder zwei Anteile entfallen. (Wenn nur eine Konstante in den Klammern steht, ergibt sich eine direkte Adressierung.) Die eckigen Klammern sind Pflicht.
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A1) ===
 +Was macht der folgende Assembler Code? Beschreibe, was deiner Meinung nach geschieht und auf der Konsole ausgegeben wird, teste anschließend.
 +
 +<code asm>
 +section .data
 +tabelle TIMES 10 DW 97
 +
 +section .text
 +   global _start    
 +_start:             
 +
 +   mov  edx,20    
 +   mov  ecx,tabelle   
 +   mov  ebx,1       
 +   mov  eax,4       
 +   int  0x80        
 +
 +   mov  eax,1      
 +   int  0x80        
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A2) ===
 +Das folgede Bild zeigt ein Speicherschema zum obigen Code. 
 +{{ :faecher:informatik:oberstufe:techinf:assembler:adressierung:adressing.png |}}
 +
 +Beantworte die folgenden Fragen:
 +
 +  * Wie groß ist der blaue Speicherbereich (2)?
 +  * Welche Adresse hat die mit (1) bezeichnete "Speicherzelle"?
 +  * Welche  Adresse hat die mit (3) bezeichnete "Speicherzelle"?
 +
 +Mache dir klar, dass die Adressierung durch Offsets erfolgt, weil vor dem Start des Programms nicht feststeht, an welchen absoluten Speicheradressen Daten und Programm bei der Ausführung geladen werden! Man kann sich also vorstellen, dass bei der Deklaration einer Variablen wie ''tabelle'' eine neue "Nulladresse" gespeichert wird, von der aus man sich dann in "Byteschritten" durch den Speicher bewegen kann.
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A3) ===
 +Was macht der folgende Code? Verfahre wie oben. Erläutere, was an den mit EINS und ZWEI markierten Stellen passiert.
 +
 +<code asm>
 +section .data
 +tabelle TIMES 10 DW 97
 +
 +section .text
 +   global _start    
 +_start:
 +             
 +   mov EBX, tabelle   ; EINS
 +   mov [EBX], word 98 ; ZWEI
 +   
 +   mov  edx,20    
 +   mov  ecx,tabelle   
 +   mov  ebx,1       
 +   mov  eax,4       
 +   int  0x80        
 +
 +   mov  eax,1      
 +   int  0x80        
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A4) ===
 +Was macht der folgende Code? Verfahre wie oben. Ergänze nach den Semikola erklärende Kommentare
 +
 +<code asm>
 +section .data
 +tabelle TIMES 10 DW 97
 +
 +section .text
 +   global _start    
 +_start:
 +             
 +   mov EBX, tabelle     ; 
 +   mov [EBX+2], word 98 ; 
 +   add EBX, 2           ;
 +   mov [EBX], word 99   ;
 +   
 +   mov  edx,20    
 +   mov  ecx,tabelle   
 +   mov  ebx,1       
 +   mov  eax,4       
 +   int :w 0x80        
 +
 +   mov  eax,1      
 +   int  0x80        
 +</code>
 +
 +Was muss man an obigem Code ändern, damit die ausgegebene Zeichenkette mit ''abc...'' beginnt. Warum beginnt sie nicht mit ''abc''? 
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A5) ===
 +Was macht der folgende Code? Verfahre wie oben. Ergänze nach den Semikola erklärende Kommentare
 +<code asm>
 +section .data
 +tabelle TIMES 10 DW 97
 +
 +section .text
 +   global _start    
 +_start:
 +
 +
 +   mov ECX, 98        ;
 +   mov EBX, tabelle   ; 
 +   mov [EBX + 2], ECX ;
 +   inc ECX            ;
 +   inc ECX            ;
 +   add EBX, 8         ;
 +   mov [EBX], ECX     ;
 +   
 +   mov  edx,20    
 +   mov  ecx,tabelle   
 +   mov  ebx,1       
 +   mov  eax,4       
 +   int :w 0x80        
 +
 +   mov  eax,1      
 +   int  0x80        
 </code> </code>
  • faecher/informatik/oberstufe/techinf/assembler/adressierung/start.1632158642.txt.gz
  • Zuletzt geändert: 20.09.2021 17:24
  • von sbel