Trochę teorii

Transkrypt

Trochę teorii
PODSTAWOWE
ELEMENTY ASEMBLERA
TRYBY ADRESOWANIA.
OPERATORY ASEMBLERA
PODSTAWOWE ELEMENTY
ASEMBLERA
Składnia języka
Postać wiersza programu
Dyrektywy i pseudoinstrukcje
Deklaracja zmiennych
Zmienne łańcuchowe
Odwrotne przechowywanie danych o
rozmiarze powyżej jednego bajta
Podstawowa instrukcja przeniesienia:
instrukcja MOV
Modele pamięci
Pliki *.COM i *.EXE
Pobranie adresu efektywnego
SKŁADNIA JĘZYKA
Zbiór znaków alfabetu
A-Z; a-z; 0-9;
Znaki specjalne: + - _ * / = ( ) [ ] < > , . ‘ „ : ? @ $ %
Spacje (20H), CR (0DH), NL (0AH)
Stałe
liczba dwójkowa b, B: 10101b, 10101B
liczba ósemkowa q, Q: 1234q, 1234Q
liczba dziesiętna d, D:123, 123d, 123D
liczba szesnastkowa h, H; pierwszy znak nie może być
litery: dopisujemy:12h, 12H, 0AH
stałe alfanumeryczne ASCII kody, albo ciągi liter w ‘/”:
‘qwer’, „qwer”, 10, 13
Słowa kluczowe
Nazwy symboliczne
pierwszy znak ma być litera (a..z, A...Z), ‘@’, ‘_ ‘lub ‘?’:
test_1, @asdf,?qwer,a.
rozróżniane są tylko pierwsze 31 znaki, nazwa może być 1
POSTAĆ WIERSZA PROGRAMU
Z instrukcją właściwą lub wywołania
makroinstrukcji:
[etykieta:] [przedrostek] [instrukcja]
[argument(y)] [;komentarz]
Z dyrektywą lub (pseudo) instrukcją:
[nazwa] dyrektywa/instrukcja [argument(y)]
[;komentarz]
Format rozkazów:
kod_mnemoniczny [argument_1], [argument_2],
[argument_3]
DEREKTYWY I PSEUDOINSTRUKCJE
Deklaracja segmentu:SEGMENT/ENDS
nazwa SEGMENT [typ] [połączenie] [‘nazwa_klasy’]
;.............
wszystkie
instrukcje
i
dane,
należące
segmentowi.............
nazwa ENDS
temu
Deklaracja zawartości rejestrów segmentowych:
ASSUME reg_seg: nazwa[,reg_seg: nazwa....]
Np.
ASSUME DS:DANE
Inne dyrektywy:
EQU - deklaracja stałych
5000
PUBLIC
EXTERN
INCLUDE
Np.
ROZMIAR EQU
DEKLARACJA ZMIENNYCH
DB - dla zmiennych bajtowych ( np. byte,
unsigned char),
DW - dla zmiennych słowowych (np. integer,
short int),
DD - dla zmiennych dwusłowowych (np. long int),
DF - dla zmiennych trzysłowowych (np. real),
DQ - dla zmiennych czterosłowowych (np.
double),
DT - dla zmiennych pięciosłowowych (np.
extended).
ZMIENNE ŁAŃCUCHOWE
Deklaracja bezpośrednia
CIĄG_LICZB db
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
TEKST db 'Cześć!'
Znaki db
‘abcdef’, 20, 30, ‘xyz’
Deklaracja poprzez dyrektywy dup (duplicate)
TABLICA db 1000 dup (0)
TABLICA_2 db 200 dup (1,2,3,4)
TABLICA_3 db 100 dup ('stosik')
;==============================================================
;
DEMO RÓŻNYCH ZMIENNYCH - DEKLARACJA I STOSOWANIE
|
;
02.03.2012
T.D-Grekow |
;==============================================================
.MODEL SMALL
.386
.DATA
char db
10
integer dw
10000010b
long dd
1234h
real df
0abbacdh
double dq
1234abcdh
ext dt
0f0f0f0f0fh
tab1
tab2
tab3
db
db
dd
1000 dup (0)
10
DUP (10 dup (5))
10
dup (32 dup (8 dup ('$')))
temp1 db
temp2 dd
?
?
.CODE
MOV ax, @data
MOV ds, ax
MOV ax, integer
MOV al, tab2
MOV eax, tab3
MOV ah, 4ch
int 21h
END
Odwrotne przechowywanie danych
o rozmiarze powyżej jednego bajta
Liczby dw 0C83Ah, 700H, 419Dh, 9238h
Adres 00000
Liczba dd
1256ABEFh
EF
AB
56
12
Adres X
➔Adres X+1
➔Adres X+2
➔Adres X+3
➔
Adres FFFFFh
Modele pamięci
Tiny
Small
Medium
Compact
Large
Huge
Pliki *.COM i *.EXE
Pliki typu .exe
Pliki typu .com:
Model tiny
Przy kompilacja: klucz /t
POBRANIA ADRESU EFEKTYWNEGO
Instrukcja LEA
Przykład_2.3:
.............................
NAPIS DB ‘ALA MA KOTA$’
.............................
LEA DX, NAPIS
Dyrektywa offset:
........
.data
text1 db „TEKST1”
text2 db „TEKST2”
..............
mov dx, offset text1
.........
mov si, offset text2
………
TRYBY ADRESOWANIA.
OPERATORY ASEMBLERA
Adresowanie domyślne (cbw, mul bx)
Adresowanie natychmiastowe (ang. immidiate,
imm):
mov ax, 123h
mov al, 123
??? mov cl, 123h???
Adresowanie rejestrowe:
MOV BX, SI ; przepisz wartość si do bx
MOV DX, BX ; przepisz zawartość bx do dx
MOV AL, BX ; ŹLE!
MOV CS, CX ; ŹLE!
MOV DS, CS ; ŹLE!
Adresowanie bezpośrednie
Proste:
MOV AX, LICZBA
MOV AX, [LICZBA]
Z przesunięciem:
LICZBA DB 15, 03AH, 23, 633, 0A9H, 0EH,
176
MOV AX, [LICZBA+3]
Przykład
.model small
.stack
.data
a db 3ah
b db 19
c db ?
.code
start:
mov ax, @data
mov ds, ax
mov al, a
mov ah, b
add ah, al
mov c, ah
end
(demo?)
Indirektane adresowanie
rejestrowe (SI, DI, BX, BP)
NORMALNE
mov al, [si]
mov al, [di]
mov al, [bx]
mov al, [bp]
;UWAGA!!!
PREDEFINIOWANE
mov al, cs:[bx]
mov al, ds:[bp]
mov al, ss:[si]
mov al, es:[di]
DS JEST DOMYŚLNY DLA BX, SI
i DI
•
DLA BP – DOMYŚNY JEST SS!!!
ADRESACJA BAZOWO INDEKSOWA
Normalna
•
Z przesunięciem
Reguły główne
BP -> SS
 R32: Baza Indeks
 Skalowany rejestr jest
rejestrem Indeksowym

Bazowy indeksowany ze
skalowaniem




Sposoby zapisu
adresu:
disp [index*n]
[base] [index*n]
disp [base] [index*n]
Przykład



Tablica DW 5, 10, 15, 20, 25
.............
mov ax, [Tablica][esi*2]





mov
mov
mov
mov
ax,
eax,
ax,
ax,
[ebx*2+Table]
[ebx+ecx*4]
[ebx*8+ecx+4]
4 [ecx] [ebx*4]
Operatory Asemblera
Operatory arytmetyczne (+, -, *, /, MOD)
 dodawanie/odejmowanie:
mov ax, licz1+licz2-licz3
 mnożenie/dzielenie:
mov cx, TabSize / ElemSize

MOD: reszta z dzielenia całkowitego:
mov
ah, 14d MOD 3
; =2
 Operatory przesunięcia (SHL, SHR):mov ah, 3 SHL 3
 Operatory logiczne: mov
ax, konst OR 5
 Operatory relacji:
mov cx, ((Var LT 100) AND 100) OR (Var GE 100)
AND 200)


Podobne dokumenty