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:adressierung:start [20.09.2021 17:29] – [Direkte Speicheradressierung] sbel | faecher:informatik:oberstufe:techinf:assembler:adressierung:start [21.09.2021 07:01] (aktuell) – sbel | ||
---|---|---|---|
Zeile 16: | Zeile 16: | ||
BYTE_VALUE | BYTE_VALUE | ||
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 |
</ | </ | ||
Zeile 39: | Zeile 39: | ||
<code asm> | <code asm> | ||
MOV AX, Zaehler1 ;Direkte Adressierung ohne eckige Klammern | MOV AX, Zaehler1 ;Direkte Adressierung ohne eckige Klammern | ||
- | MOV [bigcount],ecx ;Direkte Adressierung mit eckigen Klammern | + | MOV [bigcount],ECX ;Direkte Adressierung mit eckigen Klammern |
MOV ECX, [Feld+2] ;Direkte Adr. von Feld + 2 Byte | MOV ECX, [Feld+2] ;Direkte Adr. von Feld + 2 Byte | ||
+ | </ | ||
+ | |||
+ | ==== 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, | ||
+ | <code asm> | ||
+ | inc [Haufigkeit+5] | ||
+ | </ | ||
+ | |||
+ | 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 ' | ||
+ | Haeufigkeit times 26 DB 0 | ||
+ | </ | ||
+ | |||
+ | im Codesegment eine direkte Adressierung wie z.B. | ||
+ | <code asm> | ||
+ | INC [Haeufigkeit+3] | ||
+ | </ | ||
+ | |||
+ | nicht zweckmäßig, | ||
+ | |||
+ | Genau dies erlaubt die Register-indirekte Adressierung oder kurz indirekte Adressierung: | ||
+ | |||
+ | <code asm> | ||
+ | MOV BX, 3 ; | ||
+ | INC [Haeufigkeit+BX] ;indirekte Adressierung | ||
+ | </ | ||
+ | wird nun auch das Feldelement 3 angesprochen, | ||
+ | |||
+ | |||
+ | Die indirekte Adressierung bietet die Möglichkeit, | ||
+ | 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. | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (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 | ||
+ | | ||
+ | _start: | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A2) === | ||
+ | Das folgede Bild zeigt ein Speicherschema zum obigen Code. | ||
+ | {{ : | ||
+ | |||
+ | Beantworte die folgenden Fragen: | ||
+ | |||
+ | * Wie groß ist der blaue Speicherbereich (2)? | ||
+ | * Welche Adresse hat die mit (1) bezeichnete " | ||
+ | * Welche | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (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 | ||
+ | | ||
+ | _start: | ||
+ | |||
+ | mov EBX, tabelle | ||
+ | mov [EBX], word 98 ; ZWEI | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (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 | ||
+ | | ||
+ | _start: | ||
+ | |||
+ | mov EBX, tabelle | ||
+ | mov [EBX+2], word 98 ; | ||
+ | add EBX, 2 ; | ||
+ | mov [EBX], word 99 ; | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | int :w 0x80 | ||
+ | |||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Was muss man an obigem Code ändern, damit die ausgegebene Zeichenkette mit '' | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (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 | ||
+ | | ||
+ | _start: | ||
+ | |||
+ | |||
+ | mov ECX, 98 ; | ||
+ | mov EBX, tabelle | ||
+ | mov [EBX + 2], ECX ; | ||
+ | inc ECX ; | ||
+ | inc ECX ; | ||
+ | add EBX, 8 ; | ||
+ | mov [EBX], ECX ; | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | int :w 0x80 | ||
+ | |||
+ | | ||
+ | | ||
</ | </ |