Kurs programowania w asemblerze
Stałe i zmienne
Zmienne
W asemblerze, jak i w innych językach programowania mamy do dyspozycji kilka dyrektyw, które umożliwiają definiowanie zmiennych.
- DB (define byte) - obszar o rozmiarze jednego bajta
- DW (define word) - zmienna o rozmiarze jednego słowa (dwóch bajtów)
- DD (define doubleword) - zmienna o rozmiarze dwóch słów (cztery bajty)
- DF - zmienna o rozmiarze trzech słów
- DQ - zmienna o rozmiarze czterech słów
- DT - zmienna o rozmiarze pięciu słów
Przykładowe zmienne:
X DW 0 LICZBA DW 123H A DD ? LITERA DB "A"
Deklarując zmienne nadajemy im konkretne wartości. Można również przypisać, tak jak jest w przykładzie literę, co w rezultacie jest przypisaniem liczby o kodzie ASCII danej litery. Jeśli wartość liczby nie jest wiadoma, dana zmienna będzie dopiero wykorzystana, wpisujemy znak zapytania. Wówczas zmienna nie ma określonej wartości.
W zmiennych można przetrzymywać również etykiety, np:
START: ... <program> ... ADRES16 DW START ; zmienna zawiera przesunięcie (offset) etykiety START ADRES32 DD START ; zmienna zawiera segment i przesunięcie etykiety START
W Asemblerze można również deklarować łańcuchy, np:
POTEGI_LICZBY_2 DW 1, 2, 4, 8, 16, 32, 64 KODY DB 123, 54, 12, 143
Można deklarować również teksty, lub teksty i liczby, np:
NAPIS DB "Autor: Karol Wierzchołowski" KOMUNIKAT DB "ERROR CODE 23" COS_TAM DB 12,"123",23,56
Teksty można podawać w cudzysłowach bądź apostrofach. Jeśli jednak rozpoczniesz ciąg znakiem cudzysłowem, to musisz później go zamknąć również tym samym znakiem.
Jeśli chcemy stworzyć tablicę o dużej wielkości, można posłużyć się dyrektywą DUP, np.
TABLICA DB 1024 DUP (?)
Zostanie stworzona tablica 1KB-owa o nieokreślonych wartościach. Można jednak nadać jej wartość, np.:
TABLICA DB 1024 DUP (0)
Zostanie stworzona taka sama tablica, tylko zostanie wyzerowana. Można również tak:
TABLICA DB 1024 DUP ('BINBOY')
Jeśli chcemy zadeklarować bardzo dużą tablicę, to deklarujemy ją w osobnym segmencie, np. jeśli będziemy przechowywać w niej obrazek, to zrobimy tak:
SCREEN SEGMENT EKRAN DB 64000 DUP (?) SCREEN ENDS
Struktury
nazwa_struktury STRUCT pole1 pole2 ... nazwa_struktury ENDS
Dyrektywa STRUCT umożliwia definiowanie struktur danych, tj. pewne zgrupowanie zmiennych, niekoniecznie tego samego typu. Sama definicja struktury nie powoduje włączenia danych do programu. Zapamiętywana jest ona dopiero przy jej zadeklarowaniu.
Poszczególne pola struktury mają następujący format:
nazwa_pola DB wartość_początkowa
Nazwa_pola określa przesunięcie pola liczone od początku struktury. Struktur nie można zagnieżdżać.
Ogólny format deklaracji struktury jest następujący:
nazwa_struktury STRUCT <[wart._pola1],...>
Do struktury odwołujemy się za pomocą kropki, np.:
PRACOWNIK STRUCT NAZWISKO DB ''; nazwisko IMIE DB ''; imię WIEK DB ? STAZ DB ? PRACOWNIK ENDS KOWALSKI PRACOWNIK <"Kowalski","jan",,2>
Mając już zadeklarowaną strukturę odwołujemy się do niej np. tak:
MOV AL,KOWALSKI.STAZ
Do AL zostanie załadowany staż naszego Kowalskiego. Można również tak:
LEA BX,KOWALSKI ...... MOV AL,[BX].STAZ
Rekordy
nazwa_rekordu RECORD nazwa_pola:szerokosc [=wyrazenie],...
Dyrektywa RECORD definiuje pewien rodzaj struktury danych, gdzie operujemy na bitach. Nazwa_rekordu identyfikuje nasz rekord. Nazwa_pola określa pole w rekordzie, szerokość, liczbę bitów, z których się składa pole, a opcjonalne "wyrazenie", nadaje początkową wartość, np.:
DATA RECORD ROK:7,MIESIAC:4,DZIEN:5
Tak zadeklarowany rekord tworzy strukturę postaci:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ROK
MIESIĄC
DZIEŃ
Format deklaracji:
[nazwa] nazwa_struktury <[wartosc],..>
np.:
DZIS DATA <87,12,31>
Z tak zdefiniowanej daty wyizolujemy wartość roku. Użyjemy więc operatora MASK:
MOV BX,DZIS AND BX,MASK ROK ;IZOLUJE BITY ROKU MOV CL,ROK ;LICZBA BITÓW Z PRAWEJ STRONY POLA SHR BX,CL
W BX mamy naszą datę.
Stałe i symbole
Podczas pisania programów często zachodzi potrzeba użycia tych samych wartości. Wówczas można stworzyć stałą przy pomocy dyrektywy EQU. Działanie jej polega na przypisaniu nazwie określonej stałej wartości, np:
LICZBA EQU 123
Można również przypisywać do stałych wyrażenia, np:
GETAL EQU MOV AL, DS:[SI]
Teraz w programie wpisanie:
GETAL
powoduje wykonanie instrukcji MOV AL,DS:[SI]
W asemblerze można również przypisać inną nazwę rejestrowi, np:
REJ_AX EQU AX
