Podstawy konstruowania programów w języku Asembler 63
asembler MASM praktycznie różni się (szczegółami) od pisania programów dla TAŚM. Autor niniejszej książki używać będzie programu TAŚM, kierując się osobistym przyzwyczajeniem do tego narzędzia.
Spróbujmy skonstruować pierwszy program asemblerowy, tym samym wprawiając całą machinę asemblerową w ruch. Zanim jednak to zrobimy, krótko opisane zostaną niektóre dyrektywy, konieczne do stworzenia programu.
• SEGMENT - dyrektywy SEGMENT i ENDS dzielą program źródłowy na segmenty. Program może mieć cztery rodzaje segmentów: danych, kodu, stosu i dodatkowy. Dyrektywa SEGMENT może posiadać trzy argumenty: typ segmentu, połączenie, klasę. Typ segmentu określa początek adresu rozpoczynającego segment przechowywany w pamięci. Połączenie określa sposób łączenia segmentu z innymi segmentami o tej samej nazwie. Klasa segmentu ma wpływ na kolejność przechowywania segmentów.
• ENDS-jw.
• END - dyrektywa sterująca asemblerem, wyznaczająca asemblerowi koniec asemblacji programu źródłowego. Wszystko to, co wystąpi za dyrektywą END, będzie pomijane podczas asemblacji.
• ASSUME - dyrektywy SEGMENT i ENDS zaznaczają początek i koniec segmentu programu, jednak nie wskazują asemblerowi, jaki rodzaj segmentu jest definiowany. To wskazanie umożliwia dopiero dyrektywa ASSUME. Dyrektywa ma postać ogólną: ASSUME rejestr segmentowy:nazwa segmentu lub ASSUME rejestr segmentowy:NOTHING. Na przykład ASSUME DS: Dane oznacza, iż segmentem danych jest segment o nazwie Dane, a rejestr DS będzie zawierał początek segmentu Dane.
• ORG - dyrektywa sterująca asemblerem. Ustawia wskaźnik asemblera na wartość występującą po dyrektywie ORG, powodując przechowywanie przez asembler danych i instrukcji od miejsca wskazanego dyrektywą ORG. Dyrektywa ORG 100H używana jest w konstrukcji programów typu COM, wskazując asemblerowi, aby przechowywanie programu nastąpiło 0100H, czyli 256 bajtów za
/(1) przesyłamy wartość 0000H do rejestru AZ...
gdyż bezpośrednio do DS nie można tego zrobić ;(3) przesyłamy wartość OB80011 pośrednio do...
*.
bieżącą pozycją
MALUJ SEGMENT ASSUME C5:MALUJ M0V AX, 0000H M0V DS, AX M0V AX, 0B800H M0V ES, AX M0V SI »0000H M0V DI, 1*160D M0V CX,3*80D CLD
;(4)... rejestru AX, a docelowo do ES ;(5) adres offsetu pamięci, skąd kopiujemy ;(6) adres ojfsetu pamięci, dokąd kopiujemy ;{7) 240 znaków (włącznie z ich atrybutami)
;(8) kopiowanie „wprzód”
I*,;