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