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)