"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...

 

Powrót do spisu treści kursu


Copyright by Grzegorz Złotowicz
Form and Graphics: Michał Stanek

Pytanie komentarz do Autora