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:

0000000000000000

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

Autor: Karol Wierzchołowski, opracowano: 12.01.2002 r. Wszelkie prawa zastrzeżone.
Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?