"Deklaracja danych"
Sama deklaracja danych jest bardzo prosta - podobnie jak w pascalu możemy nadać zadeklarowanej danej nazwę; nie wyróżnia się tu jednak typów danych tak złożonych jak w pascalu - istnieją generalnie tylko 3: byte (bajt), word (słowo - 2 bajty) i double word (podwójne słowo - 4 bajty).
Istnieje też możliwość deklaracji łańcucha znaków - tekstu, co przyda się nam za chwilę, lub obszaru dowolnej długości wypełnionego jakąś określoną wartością - tego sposobu używa się np. do zadeklarowania "bufora", który będzie modyfikowany w trakcie działania programu.
Program pokazujący sposób deklaracji danych
Skoro już umiemy deklarować dane łańcuchowe, możemy ponownie otworzyć spis funkcji przerwania 21H i spróbować naszych sił pisząc program bazujący na funkcji 09H tego przerwania.
Przerwanie 21H,
funkcja 09H - wyświetlenie napisu:
AH = 09H DS:DX = wskaźnik pierwszego
znaku napisu,
Przerwanie nie zwraca nic.
Napis musi być zakończony znakiem '$'.
Prawie wszystko jasne, jedyną zagadkę
stanowi słówko "wskaźnik" w opisie tej
funkcji.
Wbrew pozorom jest to proste - DS
musi być ustawione na segment pamięci, w którym znajduje się
nasz napis a DX na
przesunięcie tego napisu w segmencie.
Kolejną cechą programów .com,
która przychodzi nam tu z pomocą jest fakt, że w tych
programach CS = DS -
kod programu jest zapisany w tym samym segmencie co dane programu
i już przy ładowaniu pliku .com do pamięci CS jest ustawiane na tą
samą wartość co DS.
Pozostaje więc problem fatalnego przesunięcia - tutaj z kolei
przyda się funkcja wewnętrzna Turbo Assemblera - OFFSET.
Funkcja ta zwraca przesunięcie danej, której nazwę podamy w
nawiasach, tak, że najpierw jest obliczane przesunięcie tej
danej po kompilacji i ta wartość jest podstawiana w miejscu,
gdzie wywołano funkcję - np:
MOV DX, OFFSET(NAPIS) spowoduje,
że podczas kompilacji zostanie obliczone przesunięcie danej
napis i wyliczona wartość zostanie podstawiona za offset - przy
dekompilacji lub debugowaniu programu w miejscu naszej instrukcji
byłaby:
MOV DX,121H
Oczywiście przy założeniu, że akurat 121H
to przesunięcie zmiennej napis.
Ktoś mógłby stwierdzić, że zamiast offset(napis) mogliśmy z góry wpisać 121H - miałby rację tzn. program prawdopodobnie by zadziałał, ale po co trudzić się skomplikowanymi wyliczeniami, skoro po pierwsze - kompilator zrobi to szybciej i dokładniej a po drugie jeśli zmienimy coś w programie, to cała matematyka na nic - wszystko trzebaby zrobić od nowa.
Dość tych teoretycznych rozważań -
przystąpmy do napisania programu... Jak zwykle - dla leniwych:)
- program gotowy . Eksperymentujcie -
zmieniając napis (może on być na prawdę długi), ale trzeba
pamiętać, że musi kończyć się znaczkiem $.
A oto przykład długiego napisu...
Copyright by Grzegorz Złotowicz
Form and Graphics: Michał Stanek