Mehrdimensionale
Variablenfelder
Von Heinz - Volker
Viehof
mehrdimensionale
Felder:
Wenn man zur addressierung
mehr als einen Zeiger benutzt erhält man ein mehrdimensionales Variablenfeld:
Zeiger x Adressiert zweiten Buchstaben ,Zeiger y
Adressiert das erste Wort :
Zeiger x=“1“ ▼
Zeiger y=„0“ ► 00 01 02 03 u.s.w.
„w“ „o“ „r“ „t“
10 11 12 13
„w“ „a“ „l“ „d“
20 21 22 23
„w“ „e“ „r“ „t“
Ergebnis: „o“
Zeiger x Adressiert dritten Buchstaben ,Zeiger y
Adressiert das zweite Wort :
Zeiger x=“2“ ▼
Zeiger y=„1“ 00 01 02 03 u.s.w.
„w“ „o“ „r“ „t“
► 10 11 12 13
„w“ „a“ „l“ „d“
20 21 22 23
„w“ „e“ „r“ „t“
Ergebnis: „l“
Auf diese weise
kann man z.B. große Datenbestände in Pufferspeichern sehr einfach durchsuchen,
oder aktualisieren, einzelne Speicherstellen lesen oder schreiben oder löschen.
Würde im obigen Beispiel
die zweite Speicherstellenreihe den entsprechenden Englischen Text enthalten,
könnte man einfach nur durch umstellen des Zeigers [y] die Textausgabe von
Deutsch auf Englisch (oder eine andere Sprache ) umschalten:
; Demoprogramm "string-2"
; <C> 2004 H.V.Viehof
;________________________________________________
stack segment stack
word 'stapel'
db 10 dup (?)
stack ends
;________________________________________________
;
; Das Variablenfeld *string* im
Datensegment
; (wo sonst ?) ,das at (@) Zeichen
markiert das
; Ende des Variablenfeldes.Die
Laenge des Strings
; muss nicht mehr explizit
angegeben werden !
;________________________________________________
data segment public word 'daten'
string db 'Die Leertaste bringt dich Weiter !',10,13,'@'
db
'_____________________________________________',10,13
db 'I
I',10,13
db 'I Das 16 Bit Assembler Beispiel fuer I',10,13
db 'I mehrdimensionale Variablenfelder ! I',10,13
db 'I___________________________________________I',10,13,'@'
db 'Vielen Dank',10,13,'@'
db 'Thank You',10,13,'@'
db 'Domo
Arregato',10,13,'@',0
data ends
code segment public
word 'prog'
main: mov ax,seg
string
mov ds,ax
;________________________________________________
;
; Die Zeiger *bx* und *si*
holen Zeichen in dl
;________________________________________________
mov
si,offset string
X3: mov bx,0
X1: mov
dl,ds:[bx+si]
;________________________________________________
;
; Ende aller Texte ? (dl
ist 0)
;________________________________________________
cmp dl,0
jz X2
;________________________________________________
;
; Ende des einzelnen
Textes ? (dl ist ‚@’
;________________________________________________
cmp dl,'@'
jnz X4
;________________________________________________
;
; Die Tastatur solange abfragen
bis die Leertaste gedrückt
; wurde, wenn ja das ‚@’
Zeichen in dl gegen ein Leer-
; -zeichen austauschen und die
Anzahl gelesener Zeichen
; aus bx in si übertragen.
;________________________________________________
X5: mov ah,1
int 021
cmp al,' '
jnz X5
mov dl,' '
add si,bx
;________________________________________________
;
; Register si noch um eins
hochzählen, sonst wird das
; ‚@’ Zeichen wieder geladen
und das Programm durchläuft
; nur noch eine Endlosschleife
(böser Laufzeitfehler)!
; dann zurückspringen nach X3
und mit bx gleich 0
; erstes Zeichen vom neuen Text
holen.
;________________________________________________
inc si
jmp X3
;________________________________________________
;
; mit der DOS Funktion 2 des
Interupts 21h werden
; einzelne Zeichen auf der
Konsole ausgegeben:
;________________________________________________
X4: mov ah,2
int 021
inc bx
jmp X1
;________________________________________________
;
; Programm beenden:
;________________________________________________
X2: mov ax,04c00
int 021
code ends
end
Beispiel:
..\download\danke\string_m.exe
In dem Beispiel
wird ein zweidimensionales Variablenfeld über die Zeiger BX und SI addressiert.
Dabei dient BX als Zeiger für die Zeichen im Text, und SI
als Zeiger für die darzustellenden Texte.
Das volständige
Beispiel findet ihr auf meiner Downloadseite und ganz allgemeine Beispiele für die angewandten Techniken .
mehrVariablenfelder/htmlversion/hvviehof/30.09.2004
Ergänzt
und geändert: 02.10.2004