| STATYSTYKI |
Od 06.09.2000
|
Optymalizacja: 1024x768, IE5 |
|
| Zmienne |
Zmienna jest niczym innym tylko miejscem w pamięci oznaczonym przez jej nazwę.
Zmienne jednostkowe
| Zmienna | ang. znaczenie | Rozmiar |
| DB | Define Byte | 1 bajt |
| DW | Define Word | 2 bajty (słowo) |
| DD | DEfine Doubleword | 4 bajty (2 słowa) |
| DF | - | 6 bajtów (3 słowa) |
| DQ | - | 8 bajtów (4 słowa) |
| DT | - | 10 bajtów (5 słow) |
Przykładowe sposoby deklarowania zmiennych:
| Przykład deklaracji | Opis |
| ZMIENNA1 db 0 | Deklaracja zmiennej ZMIENNA1 o rozmiarze 1 bajta i wartości początkowej 0 |
| ZMIENNA2 dw 12345 | Deklaracja zmiennej ZMIENNA2 o rozmiarze 1 słowa i wartości początkowej 12345 |
| ZMIENNA3 db "A" | Deklaracja zmiennej ZMIENNA3 o rozmiarze 1 bajtu z przypisaniem zmiennej wartości początkowej o kodzie ASCII danej litery |
| ZMIENNA4 dw ? | Deklaracja zmiennej ZMIENNA4 o rozmiarze 1 słowa i bez określania wartości początkowej |
? - oznacza, że deklarujemy zmienną bez nadawania jej wartości początkowej; kompilator assemblera rezerwuje tylko pamięć dla tej zmiennej. Stosujemy także zapisy: (?) lub <?> .
W zmiennych można przetrzymywać również etykiety, np:
START: ;... ;kod programu ;... END START
ADRES16 dw START ; zmienna(16-bitowa) zawiera przesunięcie (offset) etykiety START
ADRES32 dd START ; zmienna(32-bitowa) zawiera segment i przesunięcie etykiety START
Zmienne łańcuchowe
Używanie łańcuchów polega na tym, że nazwa zmiennej definiuje większą niż jeden liczbę pól w pamięci.
Wykorzystujemy tutaj dyrektywy: db, dw, dd.
Przykładowe sposoby deklarowania zmiennych łańcuchowych:
| Przykład deklaracji | Opis |
| LANCUCH1 dw 0,1,2,100,2000 | Każde pole w LANCUCH1 to 1 słowo |
| LANCUCH2 db 11, 22, 111, 222 | Każde pole w LANCUCH2 to 1 bajt |
| LANCUCH3 db "Lancuchy znakow" | Przykład deklarowania łańcuchów znaków,każde pole to 1 bajt |
| LANCUCH4 db 'abcd',10,20,'xyz' | Mieszana deklaracja,każde pole to 1 bajt |
Teksty możemy podawać w cudzysłowac "" lub w apostrofach ''.
Możemy także deklarować łańcuchy bardzo elastycznie, podając dowolny(w bajtach) ich rozmiar. Służy do tego dyrektywa dup.
| Przykład deklaracji | Opis |
| LANCUCH5 db 2000 dup(0) | Deklaracja tablicy o rozmiarze 2000 bajtów wypełnionej zerami |
| LANCUCH6 db 3000 dup(FFh) | Deklaracja tablicy o rozmiarze 2000 bajtów wypełnionej wartościami FFh |
| LANCUCH7 db 2000 dup(?) | Deklaracja tablicy o rozmiarze 2000 bajtów o nieokreślonych wartościach |
| LANCUCH8 db 50 dup('WYRAZ') | Deklaracja tablicy LANCUCH7 zawierającej 50-krotnie powtórzone wyrażenie WYRAZ; czyli tablica ma rozmiar 50x5 bajtów (5 - długość WYRAZ w bajtach) |
| LANCUCH9 dw 1000 dup(1,2,3,4) | Deklaracja tablicy LANCUCH8 zawierającej 1000-krotnie powtórzoną sekwencję 1,2,3,4; rozmiar tablicy wynosi 1000x4=4000 słow=8000 bajtów |
Czasem wykorzystujemy operator $, który zwraca bierząca wartość wskaźnika.
Przykład:
LANCUCH db 'Wartosc poczatkowa' ;deklaracja łańcucha
DLUGOSC dw $ - LANCUCH ;DLUGOSC= długość łańcucha, obliczona poprzez odjęcie adresów
Struktury
Struktura jest zbiorem jednej lub wiekszej liczby zmiennych (tych samych lub różnych typów) zgromadzonych dla wygody pod jedną nazwą.
Aby "użyć" struktury w programie trzeba ją zdefiniować, zadeklarować i odwołąć się do niej.
Szkielet definicji struktury w assemblerze wygląda następująco:
nazwa_struktury STRUCT pole_1 pole_2 ... pole_N nazwa_struktury ENDS
STRUCT jest tutajm słowem kluczowym. Sama definicja struktury nie powoduje włączenia danych do programu.
Zapamietywana jest ona dopiero przy jej zadeklarowaniu.
Poszczególne pola struktury mają następujący format:
nazwa_pola DB wartosc_poczatkowa
Nazwa_pola określa przesunięcie pola liczone od początku struktury.
W assemblerze niestety nie możemy zagnieżdżać struktur, jak to jest możliwe np. w C.
Gdy mamy już zdefiniowaną strukturę należy ją zadeklarować w kodzie źródłowym programu.
Ogólny format deklaracji struktury jest następujący:
NAZWA nazwa_struktury <wartosc_poczatkowa_pola_1,...,wartosc_poczatkowa_pola_N>
Do struktury odwołujemy się za pomocą kropki.Np.:
PRACOWNIK STRUCT
KSYWA DB ''
IMIE DB ''
WIEK DB ?
STAZ DB ?
PRACOWNIK ENDS
ZOOMEK PRACOWNIK <"zoomek","rafal",,1>
Mając juz zadeklarowaną strukturę odwołujemy się do niej np. tak:
MOV AL,ZOOMEK.STAZ
Do AL zostanie załadowany staż zoomka. Można również tak:
LEA BX,ZOOMEK ;...... MOV AL,[BX].STAZ
Rekordy
Szablon rekordu:
nazwa_rekordu RECORD
nazwa_pola_1:ilosc_bitow[=wartosc_poczatkowa_1]
;...
nazwa_pola_N:ilosc_bitow[=wartosc_poczatkowa_N]
Dyrektywa RECORD definuje pewien rodzaj struktury danych, gdzie operujemy na bitach. Nazwa_rekordu identyfikuje nasz rekord. Nazwa_pola określa
pole w rekordzie, ilosc_bitow - liczbę bitów, z których składa się pole, a opcjonalne wartosc_poczatkowa, nadaje wartość początkową (0 lub 1), 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 |
7 najstarszych bitów określa ROK
4 nastepne określają MIESIĄC
a 5 najmłodszych bitów charakteryzuje DZIEŃ
Format deklaracji:
NAZWA nazwa_rekordu <wartosc_poczatkowa_1,...,wartosc_poczatkowa_N>
np.:
DZIS DATA <2000,09,29>
Z tak zdefiniowanej daty możemy wyizolować wartość roku używając operatora MASK:
MOV BX,DZIS AND BX,MASK ROK ;izoluje bity ROKU MOV CL,ROK ;liczba bitów z prawej strony pola rekordu SHR BX,CL ;w BX mamy naszą datę
<<
|
|