Sunteți pe pagina 1din 27

Formatul instruciunilor

d - direction - direcia rezultatului operaiei, i anume : d = 0, r/m r/m [Op] reg (registru) d = 1, reg reg [Op] r/m (registru sau memorie) w - word bit - indic tipul operanzilor, astfel : w = 0, operand de tip octet; w = 1, operand de tip cuvnt (2 octei); la 386/486 aceast valoare nseamn operand de dimensiune complet (16/32 bii n funcie de modul de lucru);

Registru Adresa 000 001 010 011 100 101 110 111 Cuvnt W=1 AX CX DX BX SP BP SI DI Octet W=0 AL CL DL BL AH CH DH BH

Adresele registrelor
MOD 00 01 Semnificaie Cmpul deplasament nu este prezent. Cmpul deplasament are 8 bii (low). Cmpul r/m specific un mod de adresare indexat sau un mod de adresare bazat/ indexat, cu deplasament. Cmpul deplasament are dimensiune complet, adic are 16 bii, n modul de lucru pe 16 bii, i respectiv 32 bii, n modul pe 32 bii; deplasamentul este cu semn i urmeaz dup cmpul r/m. Cmpul r/m specific un registru, i utilizeaz aceeai codificare cu cmpul reg.

10

11

Semnificaia cmpului MOD

r/m 000 001 010 011 100 101 110 111

Adresa efectiv [BX] + [SI] + deplasament [BX] + [DI] + deplasament [BP] + [SI] + deplasament [BP] + [DI] + deplasament [SI] + deplasament [DI] + deplasament [BP] + deplasament [BX]+ deplasament

Adresa efectiv (386/486) [EAX] + scala*index + depl [ECX] + scala*index + depl [EDX] + scala*index + depl [EBX] + scala*index + depl [ESP] + scala*index + depl [EBP] + scala*index + depl [ESI] + scala*index + depl [EDI] + scala*index + depl

Codificarea modului de adresare

Exist, n principal, ase moduri de adresare: - direct, adresa efectiv (AE) a operandului este reprezentat de deplasamentul coninut n instruciune; - indirect, AE este ntr-unul din registrele de baz sau index; - bazat, AE este suma dintre deplasament i coninutul unui registru de baz (BX sau BP); - indexat, AE este suma dintre deplasament i coninutul unui registru index (SI sau DI); - bazat i indexat, AE este suma dintre coninutul a dou registre: unul de baz i unul index; - bazat i indexat cu deplasament, AE se obine ca suma a unui registru de baz, unui registru index i un deplasament; Alte modurile de adresare: - imediat, operandul este coninut n instruciune; - la registre, operandul se afl ntr-un registru;

Pe lng acestea mai exist i dou moduri de adresare speciale : - adresarea irurilor; - adresarea porturilor de I/O. Majoritatea instruciunilor cu doi operanzi permit fie ca memoria sau un registru s fie un operand, fie un registru sau o constant, coninut n instruciune, s fie utilizat ca cel de-al doilea operand. Operaiile care s aib ambii operanzi n memorie sunt excluse (cu excepia operaiilor pe iruri i a operaiilor cu stiva). Toate operaiile cu doi operanzi, cu excepia nmulirii, mpririi i a operaiilor pe iruri, permit ca operandul surs s apar n instruciune ca dat imediat. Unitatea de execuie (EU) are acces la operanzii imediai i registre; cnd ea are nevoie de un operand din memorie transmite la AU offsetul acestuia, i registrul segment, iar AU determin adresa fizic a operandului, n funcie de modul de adresare, pe care o transmite ctre BU.

Tipul referinei la memorie Fetch instruciune Operaii cu stiva Variabile de memorie Operaii pe iruri - irul surs - irul destinaie BP utilizat ca registru de baz

Adresa de baz a segmentului Implicit CS SS DS Alternativ CS , ES , SS Offset IP SP Adresa Efectiv

DS ES SS

CS , ES , SS CS , ES , SS

SI DI Adresa Efectiv

Cod operaie 12 octei

mod reg r/m 01 octei

SIB 01 octei

Deplasament 0, 1, 2, 4 octei

Operand 0, 1, 2, 4 octei

Prefix instruciune

Prefix segment

Prefix dimensiune Prefix dimensiune adres operand

Moduri de adresare - Adresarea direct, nu implic nici un registru, AE este specificat chiar n codul instruciunii, prin deplasament. Exemple de instruciuni: mov ax, adr_w ; adr_w - adres operand cuvnt mov adr_w[2], si ; transfer la adresa adr_w + 2

- Adresarea indirect prin registre face referire la memorie prin intermediul registrelor index sau de baz, care vor conine AE. LA utilizeaz pentru adresarea indirect operatorul index []. Exemple de instruciuni: mov ax, [bx] mov bx, [si] La 286 numai registrele index i de baz pot fi folosite..

- Adresarea bazat determin adresa efectiv adunnd coninutul unui registru de baz cu deplasamentul din instruciune. mov ax, depl[bx] mov ax, [depl + bx] mov ax, [bx] + depl]

Adresarea indexat este asemntoare cu cea bazat, ntruct adresa efectiv se obine tot ca o sum ntre un registru, de aceast dat index SI sau DI, i deplasamentul din instruciune.

Adresarea bazat i indexat utilizeaz pentru calculul adresei efective dou registre, unul de baz i unul index, i un deplasament .

Adresarea unei structuri din stiv

Exemple de instruciuni: mov ax, aw[bx][si] mov ax, depl[bp][di]

Adresarea imediat, presupune c operandul se afl chiar n instruciune - octetul 3, sau octeii 3-4, dac operandul are 16 bii dac nu avem deplasament sau octeii 5 i respectiv 5-6, dac instruciunea are i deplasament. Exemple de instruciuni: mov ax, 100h add beta [bx][si], 0ce43h mov alfa [bp][di], 0f7h

- Adresarea la registre. n acest caz adresa efectiva a operandului este adresa unui registru general, adic operandul este ntr-un registru Exemple de instruciuni: mov ax, si; mov ah, cl; mov ds, bx

Adresarea irurilor. Instruciunile pe iruri nu utilizeaz modurile anterioare de adresare a memoriei pentru a adresa operanzii irurilor. Se utilizeaz, n mod implicit, registrele index pentru a determina adresa efectiv, iar pentru a determina adresa de segment se utilizeaz registrele segment: ES - pentru irul destinaie, i respectiv DS - pentru irul surs (dac nu este prefixat un alt registru segment pentru surs). Exemple de instruciuni: movs sir_dest, sir_sursa movsb cmpsw

- Adresarea porturilor de intrare/ieire (I/O). - adresarea direct a porturilor, care presupune c adresa portului de I/O se gsete n instruciune, pe 8 bii, i deci pot fi adresate porturile din spaiul de adrese 0-255. Exemple de instruciuni: in al, port_octet; citire de port de tip octet in ax, port_cuvant; citire de la port cuvnt out port_oct, al; scriere la port octet out port_cuv, ax; scriere la port cuvnt

- adresarea indirect a porturilor de I/O care se realizeaz, n mod implicit prin registrul DX, care conine adresa efectiv a portului (instruciunea are un singur octet). n acest mod pot fi adresate toate porturile din spaiul de I/O: 0 65535. Exemple: in al, dx ; citire de la port de tip octet in ax, dx ; citire de la port cuvnt out dx, al ; scriere la port octet out dx, ax ; scriere la port cuvnt

X 15

Limbajul de asamblare utilizeaz simboluri i expresii simbolice pentru exprimarea codurilor operaiilor, a adreselor i a operanzilor; utilizeaz comenzi simbolice pentru controlul procesului de asamblare i gestiunea resurselor calculatorului. Elementele constitutive ale limbajului de asamblare sunt: - alfabetul; - cuvintele formate cu acest alfabet (identificatori, constante); - propoziii formate din aceste cuvinte i alfabet; Identificatorii sunt secvene de lungime 131 caractere alfanumerice i speciale: ? _ @ $. Nu este permis blancul. Identificatorii standard: - nume de instruciuni: MOV, ADD, SUB, INT etc.; - nume de resurse: AX, BX,.., CS, DS,.., AH, AL etc.; - nume de operatori: MOD, OFFSET, SEG, PTR, TYPE etc.; - pseudoinstruciuni pentru asamblor: ASSUME,.MODEL etc.

Identificatorii definii de utilizator vor fi folosii pentru: - nume de variabile, adrese de instruciuni, operanzi; - nume proceduri, segmente, macroinstruciuni. Definirea constantelor Constantele pot fi numerice sau iruri de caractere. Constantele ntregi, reprezint numere ntregi, ce pot fi utilizate n funcie de context, pentru: date, adrese, operanzi imediai. Constantele pot fi reprezentate n binar, octal, zecimal sau hexazecimal; reprezentarea ntr-una din aceste baze se specific printr-una din literele B, Q, D sau H, care urmeaz constanta: - binar: 01101010B; - octal: 152Q; - zecimal: 106D sau 106; - hexazecimal: 6aH;

Pentru a evita confuzia ntre constantele hexazecimale i identificatori, ntotdeauna o constant hexazecimal trebuie s nceap cu o cifr (de ex.: 0abcdH, pentru a nu fi confundat cu identificatorul abcdH). .RADIX < expresie > Constantele reale sunt reprezentate n virgul mobil, prin mantis i exponent, n general sub forma: Sm exponent mantis exponentul numrului e deplasat cu o anumit valoare, n funcie de tipul reprezentrii: 7fH, pentru formatul pe 32 bii; 3ffH, pentru formatul pe 64 bii; 3fffH, pentru formatul pe 80 bii; exponentul pentru cele trei formate (32, 64 i 80 bii) se reprezint pe 8, 11 i respectiv 15 bii; mantisa este normalizat: 1.00...0 <= mantisa <=1.11...1

a) dd 1.0 ; 20 deci Sm = 0; exponent = 0 + 7f (deplasarea); mantisa = 1.00...0; se obine urmtoarea reprezentare intern: Sm, exp, mant = 0, 01111111, 00...0 = 3F 80 00 00 H b) dd -1.0 ; -20 deci Sm, exp, mant = 1, 01111111, 00...0 = BF 80 00 00 H c) dd 4.0 ; 22 deci exponent = 2 + 7f = 81H; Sm, exp, mant = 0, 10000001, 00...0 = 40 80 00 00 H d) dd -0.625 ; 2-1 + 2-3 ; deci exponent = -1 + 7f = 7e; mantisa = 1.0100...0; Sm, exp, mant = 1, 01111110, 010...0 = BF 20 00 00 H

Un alt tip de constante l reprezint constantele zecimale codificate binar (BCD): - zecimal mpachetat; - zecimal nempachetat (denumit i format ASCII); n LA aceste constante sunt reprezentate n formatul mpachetat, pe 80 bii, utiliznd declaraia de tip: dt 12345678 pentru care se pot introduce maxim 18 cifre, deoarece octetul cel mai semnificativ conine, pe primul bit, semnul numrului restul acestui octet (7 bii) fiind nefolosit. Constantele exprimate prin iruri de caractere constau dintr-o succesiune de caractere incluse ntre ghilimele ("sir caractere"). Dac n interiorul unui ir de caractere, un subir trebuie s apar ntre ghilimele, atunci aceste caractere se dubleaz: "1 Dec""1918"

Propoziii n limbaj de asamblare o succesiune de cuvinte i caractere din alfabetul limbajului de asamblare, construit dup anumite reguli sintactice, de lungime maxima 128 caractere, i care poate fi: - instruciune (pp. tradus n cod main); - pseudoinstruciune (directiv pentru asamblor, ex. segment, equ, assume, end); comenzi destinate asamblorului, referitoare la: - definiri de constante i variabile; - rezervri zone de memorie i iniializarea lor; - controlul procesului de asamblare; Sintaxa general a unei instruciuni este: [ etichet : ] [ mnemonica [ operanzi ] ] [ ; < comentarii > ]

Declararea datelor n Limbaj de Asamblare Declararea datelor se realizeaz cu pseudoinstruciuni care asigur: alocarea de memorie pentru date, specificarea tipului datelor i iniializarea datelor. Datele pot fi specificate prin nume, expresii sau iruri de caractere, care se evalueaz n procesul de asamblare la constante. Operaia de alocare i iniializare a datelor are loc n procesul de asamblare; datele sunt nscrise n fiierul obiect, de unde vor fi preluate la execuie. Sintaxa este urmtoarea: [ nume_variabil ] tip [ list_expresii ] [;comentarii] sau [ nume_variabil ] tip [numr] DUP ([ list_expresii ]) db (define byte), dw (define word), dd (define double); dq (define quadruple), df (define float), dp (define pointer); dt (define ten bytes); nume_structur

a db -100; lit db 'abcde ; codurile ASCII : 61h, 62h, 63h, 64h, 65h aw dw -1000 AB dw 'AB' ; va depune la adresa AB: 42h, 41h adrAB dw AB ; se va depune deplasamentul etichetei AB off_AB dw offset AB ; deplasamentul etichetei AB seg_AB dw seg AB; adresa segment de la locatare rez dw ? ; coninut nedefinit v1 dd 1.0 ; valoare real definit pe 32 bii v2 dd 1A2B3C4Dh ; valoare ntreag pe 32 bii adr_v1 dd v1 ; pointer pentru referirea lui v1 db 100 dup (0) ; multiplicarea valorilor iniiale db 2 dup (0, 3 dup (1)), 10, 25, 100) dw 100 dup (5 dup (4), 7)