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 temu segmentowi... nazwa ENDS Deklaracja zawartości rejestrów segmentowych: ASSUME reg_seg: nazwa[,reg_seg: nazwa...] Np. ASSUME DS:DANE Inne dyrektywy: EQU - deklaracja stałych Np. ROZMIAR EQU 5000 PUBLIC EXTERN INCLUDE
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 db 1000 dup (0) tab2 db 10 DUP (10 dup (5)) tab3 dd 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
Adres FFFFFh 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
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 (demo?).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
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 ax, [ebx*2+table] mov eax, [ebx+ecx*4] mov ax, [ebx*8+ecx+4] mov ax, 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)