23
Unităţile centrale ale calculatoarelor. Assembler 2 Setul de instrucţiuni 8086 În cadrul acestui capitol, sunt prezentate în detaliu instrucţiunile de bază ale familiei de procesoare Intel. Acolo unde este cazul, se specifică tipurile interzise de adresare. Setul de instrucţiuni este grupat în 6 clase: instrucţiuni de transfer, care deplasează date între memorie sau porturi de intrare/ieşire şi registrele procesorului, fără a executa nici un fel de prelucrare a datelor; instrucţiuni aritmetice şi logice, care prelucrează date în format numeric; instrucţiuni pentru şiruri, specifice operaţiilor cu date alfanumerice; instrucţiuni pentru controlul programului, care în esenţă se reduc la salturi şl la apeluri de proceduri; instrucţiuni specifice întreruperilor hard şi soft; instrucţiuni pentru controlul procesorului. Această împărţire este realizată după criterii funcţionale. De exemplu, instrucţiunile PUSH şi POP sunt considerate ca instrucţiuni de transfer, deşi, ia prima vedere, ar putea fi considerate instrucţiuni specifice procedurilor. Acelaşi lucru despre instrucţiunile IN şi OUT, care interfaţează procesorul cu lumea exterioară: ele sunt considerate instrucţiuni de transfer, deşi ar putea fi considerate instrucţiuni de intrare/ieşire. Intrările şi ieşirile sunt însă cazuri particulare de transfer. Fiecare categorie de instrucţiuni este însoţită de specificarea explicită a indicatprilor de condiţie care sunt modificaţi în urma execuţiei. 2.1 Instrucţiuni pentru transferuri de date, instrucţiuni în aritmetica binara și în aritmetica BCD. Noţiuni teoretice Instrucţiunile de transfer permit copierea unui octet sau cuvânt de la sursa la destinaţie. Destinaţia poate fi un registru, locaţie de memorie sau un port de ieşire, iar sursa poate fi un registru, o locaţie de memorie, constante sau port de intrare. Ca regula generală destinaţia şi sursa nu pot fi ambele locaţii de memorie. În specificarea sursei şi destinaţiei se vor folosi notaţiile: segment: offset pentru adrese fizice; (x) paranteze rotunde pentru a desemna “conţinutul lui x”. OBS. Instrucţiunea de transfer nu modifica indicatori de condiţie (flagurile) cu excepţia instrucţiunilor SAHF şi POPF. 2.1.1 Instrucţiuni de transfer a) Instrucţiunea MOV (Move Data). Forma generală a instrucţiunii Mov este: mov dest, sursa ; (dest) (sursa) realizează transferul informaţiei de la adresa efectiva data de sursa 10

Assembler 2

Embed Size (px)

DESCRIPTION

Assembler 2

Citation preview

Page 1: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler2 Setul de instrucţiuni 8086

În cadrul acestui capitol, sunt prezentate în detaliu instrucţiunile de bază ale familiei de procesoare Intel. Acolo unde este cazul, se specifică tipurile interzise de adresare.

Setul de instrucţiuni este grupat în 6 clase: instrucţiuni de transfer, care deplasează date între memorie sau porturi de intrare/ieşire şi registrele

procesorului, fără a executa nici un fel de prelucrare a datelor; instrucţiuni aritmetice şi logice, care prelucrează date în format numeric; instrucţiuni pentru şiruri, specifice operaţiilor cu date alfanumerice; instrucţiuni pentru controlul programului, care în esenţă se reduc la salturi şl la apeluri de proceduri; instrucţiuni specifice întreruperilor hard şi soft; instrucţiuni pentru controlul procesorului.

Această împărţire este realizată după criterii funcţionale. De exemplu, instrucţiunile PUSH şi POP sunt considerate ca instrucţiuni de transfer, deşi, ia prima vedere, ar putea fi considerate instrucţiuni specifice procedurilor. Acelaşi lucru despre instrucţiunile IN şi OUT, care interfaţează procesorul cu lumea exterioară: ele sunt considerate instrucţiuni de transfer, deşi ar putea fi considerate instrucţiuni de intrare/ieşire. Intrările şi ieşirile sunt însă cazuri particulare de transfer.

Fiecare categorie de instrucţiuni este însoţită de specificarea explicită a indicatprilor de condiţie care sunt modificaţi în urma execuţiei.

2.1 Instrucţiuni pentru transferuri de date, instrucţiuni în aritmetica binara și în aritmetica BCD. Noțiuni teoretice

Instrucţiunile de transfer permit copierea unui octet sau cuvânt de la sursa la destinaţie. Destinaţia poate fi un registru, locaţie de memorie sau un port de ieşire, iar sursa poate fi un registru, o locaţie de memorie, constante sau port de intrare. Ca regula generală destinaţia și sursa nu pot fi ambele locaţii de memorie. În specificarea sursei și destinaţiei se vor folosi notaţiile:

segment: offset pentru adrese fizice; (x) paranteze rotunde pentru a desemna “conţinutul lui x”.

OBS. Instrucţiunea de transfer nu modifica indicatori de condiţie (flagurile) cu excepţia instrucţiunilor SAHF și POPF.

2.1.1 Instrucţiuni de transfera) Instrucţiunea MOV (Move Data).

Forma generală a instrucţiunii Mov este:mov dest, sursa ; (dest) (sursa)

realizează transferul informaţiei de la adresa efectiva data de sursa la dest.Exemplu:

mov ax, alfa; transfera conţinutul adresei alfa în axmov bx, offset alfa; transfera adresa efectiva alfa în bxmov al, 75h; transfera 75h în almov cx, [100]; transfera conţinutul adresei 100 în cxmov [di], bx; transfera conţinutul lui bx la adresa conţinuta în dimov byte ptr alfa , [bx]; pune conţinutul octetului de la adresa ;dată de bx la adresa alfa

b) Instrucţiunea XCHG ( Exchange Data )Interschimbă sursa cu destinaţia. Forma generală:

XCHG dest, sursaRestricţii:

registrele de segment nu pot apărea ca operanzi; cel puţin un operand trebuie sa fie un registru general.Exemple:

xchg al, ahxchg alfa, axxchg sir [si], bxxchg cs: [bx][si], ax

10

Page 2: Assembler 2

Unităţile centrale ale calculatoarelor. AssemblerInterschimbarea conţinutului a doi operanzi din memorie op1 și op2 se poate face prin secvenţa de

instrucţiuni:mov reg, op1xchg reg, op2mov op2, reg

c) Instrucţiunea XLAT (Translate)Forma generală:

XLATInstrucţiunea nu are operanzi, semnificaţia fiind:(al) ds: ((bx)+(al))

adică se transfera în al conţinutul octetului de la adresa efectiva : (bx)+(al).Instrucţiunea se folosește la conversia unor tipuri de date, folosind tabele de conversie, adresa acestor

tabele se introduce în bx, iar în al se introduce poziţia elementului din tabel. De exemplu: conversia unei valori numerice cuprinsă intre 0 și 15 în cifrele hexazecimale corespunzătoare, se poate face prin:

tabel DB '0123456789abcdef''. . . . . . . . . .

lea bx, tabelmov al,11xlatÎn al se va depune cifra hexazecimala b.

d) Instrucţiunea IN (Input Data)Execută o citire de la portul de intrare specificat 8 sau 16 biţi, după cum se specifica registrul al sau

ax sau alte registre generale, pentru noile procesoare.Forma generală: IN dest, portunde:

dest este registrul al sau ax (noile procesoare acceptă și alte registre în locul lui al, respectiv ax); port este o constantă cuprinsă intre 0 și 255, sau registrul dx.

e) Instrucţiunea OUT (Output Data)Execută o scriere la portul de iesire specificat de 8 sau 16 biţi, după cum se specifică registrul al sau

ax.Forma generală :

OUT dest, portunde:

destinaţie este registrul al sau ax; port este o constantă cuprinsă intre 0 și 255 sau registrul dx.

f) Instrucţiunea LEA (Load Effective Address)Are ca efect încarcărea adresei efective (offsetul) intr-un registru general.

Forma generală: LEA reg, sursa

unde: sursa -este un operand aflat în memorie, specificat printr-un mod de adresare ; reg- este un registru general.Exemplu:

lea bx, alfalea si, alfa [bx][si]

Acelasi efect se obţine folosind operandul OFFSET în Instrucţiunea MOV:movbx, offset alfamovsi, offset alfa [bx][si]

g) Instrucţiunea LDS (Load Data Segment)Forma generală:

11

Page 3: Assembler 2

Unităţile centrale ale calculatoarelor. AssemblerLDS reg, sursaunde:

reg -este un registru general de 16 biti; sursa -este un operand de tip double – word aflat în memorie, care conţine o adresă completă de 32

biţi.Are ca efect transferul unei adrese complete în perechea de registre ds și reg specificat în instrucţiune, adică:

(reg) ((sursa))(ds) ((sursa) + 2)

Exemplu:alfa db 25

adr_alfa dd alfa . . . . . . .. . .. . . .

lds si, adr-alfamovbyte ptr [si], 75

. . . . .. . . .. . . . . . . .

h) Instrucţiunea LES (Load Extra Segment)Forma generală :

LES reg, sursaunde:

reg- este un registru general; sursa- este un operand de tip dd.Efectul instrucțiunii este următorul: în registru se încarcă offsetul operandului sursa iar în registrul es se încarcă segmentul (adresa de segment) aflat la adresa sursa + 2, adică:

(reg) ((sursa))(es) ((sursa) + 2)

Exemplu:b dw 3467h

adr_b dw b. . . . . .. . . . . .. . . . . .

les di, adr_bmovword ptr es: [di] , 75

Instrucțiunile LDS și LES pot fi folosite la exploatarea tabelelor de adrese. Fie tabela de adrese:Tab_adr dd R1, R2, R3, R4, R5

și dorim sa încarcăm în ax conţinutul adresei Ri, a cărei indice este dat de registrul cx. Secvenţa de instrucțiuni:

mov bx, cxmov bx, bx ; se dublează indicele 2 cxmov bx, bx ; se dublează valoarea lui bx, adică 4 cxlds si, tab_adr [bx]; încarcă în si adresa Rimov ax, ds: [si]; încarcă indirect valoarea conţinută în Ri. . . . . . . . . . . . . . . . .

încarcă în ax conţinutul adresei Ri.O adresa fizica ocupa 4 octeţi, ca atare valoarea conţinută în cx trebuie înmulţită cu 4, operaţie

realizată prin doua instrucțiuni add bx, bx

i) Instrucţiunea LAHF (Load AH with FLAGS)Instrucţiunea încarcă în registrul AH octetul dat de partea cea mai puţin semnificativa a registrului

FLAGS, ce conţine indicatorii. Instrucţiunea nu are operanzi.AH FLAGS 07

j) Instrucţiunea SAHF (Store AH into FLAGS)Instrucţiunea încarcă în registrul FLAGS, în octetul cel mai puţin semnificativ conţinutul registrului

12

Page 4: Assembler 2

Unităţile centrale ale calculatoarelor. AssemblerAH, adică:

FLAGS (AH) 07

Instrucţiunea nu are operanzi.

2.1.2 Aritmetica binaraAceste instrucțiuni modifica conţinutul registrului FLAGS.

a) Instrucţiunea ADD (Add)Forma generală:

ADD dest, sursa ; (dest) (dest) + (sursa)unde: dest poate fi un registru general sau o locatie de memorie; sursa poate fi un registru general, o locatie de memorie sau o constantă.Cei doi operanzi nu pot fi simultan locaţii de memorie.Operaţia se poate efectua pe octet sau pe cuvânt. Cei doi operanzi trebuie sa aibă aceeasi dimensiune (acelasi tip). În caz de ambiguitate se va folosi operatorul PTR.Indicatorii afectaţi sunt: AF, CF, PF, SF, ZF și OFExemple:

add ax, 5add bl, 5add ax, bxadd word ptr [Bx], 75add alfa, axadd alfa, 5add byte ptr [si], 75add byte ptr alfa, 75

b) Instrucţiunea ADC (Add with Carry)Forma generală:

ADC dest, sursa ; (dest) (dest) + (sursa) + (CF)Unde dest și sursa au aceeasi semnificaţie ca la Instrucţiunea ADD, iar CF este Carry Flag.Instrucţiunea aduna conţinutul dest cu conţinutul sursei și cu bitul de transport CF. Indicatorii afectaţi sunt aceeasi de la Instrucţiunea ADD.

Operaţia ADC se folosește la adunări de operanzi pe mai multe cuvinte, operaţie în care poate aparea transport de care trebuie sa se țină seama.Exemplu. Sa se adune doua numere op1, op2 în dubla precizie (pe 2 cuvinte).

op1 dd 12345678hop2 dd 0abcdefghreg dd ?

...................................movax, word ptr op1add ax, word ptr op2movword ptr rez, axmovax, word ptr op1+2adc ax, word ptr op2+2; se considera eventualul transportmovword ptr rez+2, ax

c) Instrucţiunea SUB (Substrat)Forma generală:

SUB dest, sursa ; (dest) (dest) – (sursa)unde dest și sursa au aceeasi semnificaţie ca la Instrucţiunea ADD. Indicatorii afectaţi sunt cei specificaţi la ADD.

d) Instrucţiunea SBB (Substrat with Borrow)Forma generală:

SBB dest, sursa ; (det) (dest) – (sursa) – (CF)

13

Page 5: Assembler 2

Unităţile centrale ale calculatoarelor. Assemblerunde semnificația dest, sursa și CF sunt cele prezentate la ADC. Instrucţiunea SBB ia în considerare eventualul împrumut. Exemplu:

Op1 dd 12345678hOp2 dd 0abcdefgh90hRez dd ?. . . . . . . . . . . . .movax, word ptr op1sub ax, word ptr op2movword ptr rez, axmovax, word ptr op1 + 2sbb ax, word ptr op2 + 2 ; se considera eventualul împrumutmovword ptr rez + 2, ax

e) Instrucţiunea INC (Increment)Forma generală:

INC dest ; (dest) (dest) + 1unde dest este un registru general, un operand din memorie de tip octet sau cuvânt. Semnificația fiind operandul dest este incrementat cu unu. Indicatorii afectaţi sunt AF, PF, SF, ZF, OF. Exemple:

inc alfainc bl

inc word ptr [Bx] [Si]

f) Instrucţiunea DEC (decrement)Forma generală:

DEC dest ; (dest) (dest) – 1unde dest are aceeasi semnificaţie ca dest de la Instrucţiunea INC. Aceeasi indicatori ca la INC sunt afectaţi.

g) Instrucţiunea NEG (Negate)Forma generală:

NEG dest : (dest) 0 – (dest) schimbare de semn unde dest este un operand pe 8 sau 16 biţi ce poate fi un registru general sau o locaţie de memorie. Instrucţiunea afectează indicatorii AF, CF, PF, SF, OF și ZF. Exemplu:

alfa db 75. . . . . . . . . . . . mov al, alfa neg al mov alfa, al ; la adresa alfa avem - 75sau neg alfa

h) Instrucţiunea CMP (Compare)Forma generală:

CMP dest, sursa ; (dest) – (sursa)Instrucţiunea realizează o operaţie de scădere intre cei doi operanzi, fără a modifica operandul dest

sau sursa cu poziţionarea indicatorilor de condiţie. Indicatorii afectaţi sunt: AF, CF, PF, SF, ZF și OF. Aceasta instrucţiune se folosește împreuna cu Instrucţiunea de salt condiţionat. Exemple:

cmp ax, alfa[Bx][Si]cmp [Si], 0

i) Instrucţiunea CBW (Convert Byte to Word)Are ca efect extinderea bitului de semn (AL7) din AL la întreg registru AH, adică:

dacaAL7 = 0 atunci

14

Page 6: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler(ah) 0

altfel(ah) 1

Instrucţiunea nu are operanzi și nu afectează indicatorii de condiţie. Exemplu. Se cere sa se adune un număr întreg cu semn reprezentat pe octet cu un număr întreg cu semn pe cuvânt.

a db -75b dw -188c dw ?. . . . . . . . .moval, acbw ; converteşte octetul la cuvântadd ax, bmovc, ax. . . . . . . . . .

j) Instrucţiunea CWD (Convert Word to Double Word)Are ca efect extinderea bitului de semn din AX (AX15) la întreg registrul DX, obţinându-se astfel AX pe 32 de biţi, adică:

daca (AX15) = 0 atunci(dx) 0

altfel(dx) 1

Instrucţiunea nu are operanzi și nu afectează indicatorii de condiţie. Exemplu. Se cere diferenţa dintre un operand reprezentat pe 2 cuvinte (DP) și unul reprezentat pe cuvânt (SP)

dp dd 12345678hsp dw 0abcdhrez dd ?. . . . . . . . . . . . . . . .movax, SPcwd ax ; operandul SP reprezentat în DX : AXmovbx, ax ; salvează ax în bxmovax, word ptr DPsub ax, bxmovword ptr rez, axmovax, word ptr DP + 2sbb ax, dx ; ia în considerare eventualul transportmovword ptr REZ + 2

k) Instrucţiunea MUL (Multiply)Forma generală:

MUL sursaunde sursa poate fi un registru sau o locaţie de memorie de 8 sau 16 biţi. Rezultatul se obţine pe un număr dublu de biţi (16 sau 32). Operaţia realizată este produsul intre acumulator și sursa cu depunerea rezultatului în acumulatorul extins (ax pe octet sau dx:ax pe cuvânt). Cei doi operanzi se consideră numere fără semn.Dacă sursa este pe octet avem:

(AX) (AL) * (sursa)iar dacă sursa este pe cuvânt avem:

(DX : AX) (AX )* (sursa)Afectează indicatorii CF și OF, ceilalţi sunt nedefiniţi. Exemplu.

a db 10hb dw 100h

15

Page 7: Assembler 2

Unităţile centrale ale calculatoarelor. Assemblerc dw ?d dd ?

.........................................................mov al, 20hmul a ; (ax)(al)*amov c, ax; depune rezultatul pe cuvântmov ax, 10hmul b ; (dx:ax) (ax)*bmov word ptr d, ax; depune rezultatul pe dublu cuvântmov word ptr d+2, dx

.........................................................

l) Instrucţiunea IMUL (Integer Multiply)Forma generală:IMUL sursa

Instrucţiunea este similara cu MUL, deosebirea constând în faptul ca cei doi operanzi se consideră numere cu semn. Afectează indicatorii CF și OF, restul sunt nedefiniţi. Exemplu:

alfa db – 93beta dw 143rez dd ?

.........................................................mov al, alfacbw ; extensia de semn în ahimul beta (dx:ax) (ax)*(beta)mov word ptr rez, axmov word ptr rez+2, dx

m) Intructiunea DIV (Divide)Forma generală:

DIV sursaunde sursa este un registru sau o locaţie de memorie, reprezentata pe octet sau cuvânt.Instrucţiunea realizează împărțirea fără semn intre deîmpărţit și împărţitor. Daca împărţitorul (sursa) este reprezentat pe octet atunci deîmpărţitul este AX și rezultatul este: catul în al iar restul în ah, adică:

DIV sursa ; (al) (ax)/(sursa); (ah) restul împărţirii (ax)/(sursa)

Daca împărţitorul (sursa) este reprezentat pe cuvânt atunci deîmpărţitul este considerat în DX și AX, câtul se obţine în AX iar restul în DX, adică

DIV sursa ; (ax) catul împărţirii (dx:ax)/(sursa); (dx) restul împărţirii (dx:ax)/(sursa)

Toţi indicatorii nu sunt definiţi. Operaţia de împărţire poate conduce la depăsiri, dacă câtul depășește valoarea maximă reprezentabilă pe 8, respectiv pe 16 biţi sau daca împărţitorul este 0.

n) Instrucţiunea IDIV (Integer Divide)Forma generală:IDIV sursa

Semnificația instrucțiunii și a operandului sursa este aceeasi ca la Instrucţiunea DIV, cu diferenţa că operanzii sunt consideraţi numere cu semn, deci împărţirea se face cu semn. Indicatorii sunt nedefiniţi. Operaţia poate conduce la depăsiri.

2.1.3 Aritmetica BCD

16

Page 8: Assembler 2

Unităţile centrale ale calculatoarelor. Assemblera) Instrucţiunea AAA (ASCII Adjust for Addition)

Instrucţiunea nu are operanzi și executa corecţia acumulatorului AX, după operaţii de adunare cu numere în format BCD despachetaţi. Semnificația este:

daca (AL0:3) > 9 sau (AF) = 1, atunci {(AL) (AL) + 6(AH) (AH)+1(AF) 1(CF) 1(AL) (AL) AND 0FH

}Indicatorii afectaţi : AF, CF, restul nedefiniţi.Exemplu:

mov ax, 408hmov dx, 209hadd ax, dx ; (ax)=0611hAAA ; (ax)=0707h

b) Instrucţiunea AAS(ASCII Adjust for Subtraction)Instrucţiunea nu are operanzi și execută corecţia acumulatorului AX, după operaţii de scădere cu numere în format BCD despachetaţi. Semnificația este:

daca (AL0:3) > 9 sau (AF) = 1, atunci {(AL) (AL) - 6(AH) (AH) - 1(AF) 1(CF) 1(AL) (AL) AND 0FH

}Indicatorii afectaţi : AF, CF, restul nedefiniţi.Exemplu:

mov ax, 408hmov dx, 209hsub ax, dx ; (ax)=04ffhAAS ; (ax)=0109h

c) Instrucţiunea DAS (Decimal Adjust for Substraction)Instrucţiunea nu are operanzi și executa corecţia zecimala a acumulatorului AL, după operaţii de

scădere cu numere în format BCD împachetat. Semnificația este:daca (AL0:3) > 9 sau (AF) = 1, atunci {

(AL) (AL) - 6(AF) 1

}daca acum (AL4:7) > 9 sau CF = 1, atunci {

(AL) (AL) - 60H(CF) 1

}Indicatorii afectaţi : AF, CF, PF, SF, ZF. Indicatorul OF este nedefinit.

De exemplu, în urma secvenţei:MOV AL, 52HSUB AL, 24H ; AL = 2EHDAS ; AL = 28H

se obţine în AL rezultatul corect 28H.

d) Instrucţiunea AAM(ASCII Adjunct for Multiply)Instrucţiunea nu are operanzi și efectuează o corecţie a acumulatorului AX, după o înmulţire pe 8

biţi cu operanzi în format BCD despachetaţi.Semnificația este următoarea:

17

Page 9: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler(AH) (AL) / 10

(AL) (AL) MOD 10

Indicatori afectaţi: PF, SF, ZF, restul nedefinite.De exemplu

mov al, 7mov bl, 9mul bl ; 0036hAAM ; 0504h

e) Instrucţiunea AAD (ASCII Adjunct for Division)Instrucţiunea nu are operanzi și efectuează o corecţie a acumulatorului AX, înaintea unei împărţiri a

doi operanzi în format BCD despachetaţi.Semnificația este următoarea:

(AL) (AH) * 10 + (AL)(AH) 0

Indicatori afectaţi: PF, SF, ZF, restul nedefinite.De exemplu

mov ax, 305hmov bl, 2AAD ; (ax)=23hdiv bl ; (al)=11h (ah)=1

2.1.4 EXEMPLE REZOLVATE și COMENTATE

Exemplul 1. Acest exemplu prezintă câteva tehnici de adresare specifice procesoarelor din familia 8086/88: TITLE exemplul_1 .MODEL SMALL .STACK 10h .DATA alfa DW 3 DUP(?) .CODE begin: mov ax,@DATA mov ds,ax mov ax,17 ; Adresare imediata a operandului ; sursa care este o constantă ; zecimala mov ax,10001b ; Sursa este o constantă binara mov ax,11h ; Sursa este o constantă hexa mov alfa,ax ; Adresare directa a operandului ; destinaţie mov cx,ax ; Interschimbă conţinuturile mov ax,bx ; registrelor ax și bx mov bx,cx xchg ax,bx ; Acelasi efect cu secvenţa ; anterioara mov si,2 mov alfa[si],ax ; Adresare relativa cu registrul ; și a operandului destinaţie mov si,2 mov bx,OFFSET alfa; Adresare imediată a operandului ; sursă (adresa variabilei alfa) ; datorită operatorului OFFSET

18

Page 10: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler lea bx,alfa ; Aceasta instrucţiune are acelasi ; efect cu cea anterioară cu toate ; că sursa este adresată direct mov cx,[bx][si] ; Adresare bazată indexată a sursei mov cx,alfa+2 ; Această instrucţiune are acelasi ; efect cu cea anterioară, sursa ; fiind însă adresată direct mov cx,alfa[2] ; Notaţii echivalente pentru mov cx,[alfa+2] ; Instrucţiunea anterioară mov di,4 mov [bx][di],55h ; Se va semnala eroare deoarece nu ; s-a precizat tipul destinaţiei ; care este o variabila anonima mov BYTE PTR [bx][di],55h; Se va folosi această ; variantă când se doreşte o ; adresare la nivel de octet mov BYTE PTR alfa+4,55h; Această instrucţiune are ; acelasi efect cu cea anterioară, ; destinaţia fiind însă adresată ; direct. Desi alfa este definit cu ; DW, operaţia este realizata la ; nivel de octet mov si,2 mov bx,3 mov alfa[bx][si],33h; Adresare bazata indexata ; relativa a operandului destinaţie mov alfa[bx+si],33h; Notaţii echivalente pentru mov [alpha+bx+si],33h; Instrucţiunea anterioara mov [bx][si].alfa,33h mov [bx][si]+alfa,33h END begin Pentru exemplificări s-a folosit Instrucţiunea mov în diferite variante de adresare: registru la registru, din memorie în registru și din registru în memorie.

Exemplul 2. Se consideră un vector de trei componente, fiecare componentă având dimensiunea de un cuvânt. Sa se permute circular elementele vectorului cu o poziţie la stânga: TITLE exemplul_2 .MODEL SMALL .STACK 10h .DATA vect DW 100h,200h,300h .CODE start: mov ax,@DATA; Iniţializarea registrului mov ds,ax ; de segment ds mov dx,vect ; Salvare în dx a primei ; componente a vectorului mov ax,vect+2; Transferă a doua mov vect,ax ; componentă în prima mov ax,vect+4; Transferă a treia mov vect+2,ax; componentă în a doua mov vect+4,dx; Transferă prima ; componentă în ultima END start

Exemplul 3. Sa se încarce intr-o variabila pointer valoarea propriei adrese, sub forma de offset și segment.

19

Page 11: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler TITLE exemplul_3 .MODEL SMALL .STACK 10h .DATA var_ptr DD ? ; Directiva DD are ca efect generarea sau ; rezervarea unor entităţi pe 32 de biţi .CODE begin: mov ax,@DATA mov ds,ax mov ax,OFFSET var_ptr mov WORD PTR var_ptr,ax ; Operatorul OFFSET selectează componenta de ; offset a adresei unei variabile mov ax,SEG var_ptr mov WORD PTR var_ptr+2, ax ; Operatorul SEG selectează componenta de ; segment a adresei unei variabile END begin

Exemplul 4. Se consideră un vector de trei componente cuvinte. Sa se introducă valoarea 55h în octeţii superiori ai elementelor vectorului. TITLE exemplul_4 .MODEL SMALL .STACK 10h .DATA val EQU 55h vect DW 111h,222h,333h .CODE start: mov ax,@DATA mov ds,ax mov al,val ; Se încarcă valoarea ; dorita în registrul al mov BYTE PTR vect[1],al ; Se transfera mov BYTE PTR vect[3],al ; valoarea in mov BYTE PTR vect[5],al ; octeţii ; superiori ai ; elementelor vectorului END start

Exemplul 5. Se consideră un sir de 50 de cuvinte începând de la adresa sir. Sa se genereze la adresa adr_str adresa completă a sirului sub forma de offset și segment și să se încarce în elementul al 25-lea al sirului valoarea 100h. TITLE exemplul_5 .MODEL SMALL .STACK 10h .DATA nr_elem EQU 25 sir DW 50 DUP(?) adr_str DD sir ; La adresa adr_str se generează adresa ; completă a variabilei sir sub forma de ; offset și segment, offset-ul fiind memorat ; la adresa cea mai mică .CODE begin: mov ax,@DATA

20

Page 12: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler mov ds,ax lds bx,adr_str ; Se încarcă în registrul ; bx adresa de offset a variabilei sir si ; în registrul de segment ds adresa de ; segment a variabilei sir mov si,(nr_elem-1)*(TYPE sir) ; Operatorul TYPE întoarce numărul de octeţi ; ai unei componente a sirului sir. Expresia ; indicată determină adresa primului octet al ; componentei care se vrea accesată mov WORD PTR [bx][si],100h END begin

Exemplul 6. Să se adune doua numere folosind diferite moduri de adresare.Data segmenta dw 75h ; primul operandb dw ? ; al doilea operandc dw ? ; rezultatuldata endscod segmentassume cs:cod,ds:datastart: mov ax,datamov ds,ax ; încarcă ds adresa de segment de date datamov b,0a3bh ; transferă la adresa b valoarea 0a3bh

; operandul sursă este adresat imediat; operandul destinaţie este adresat direct la memorie

mov bx,offset a ; încarcă în bx adresa variabilei a ; operandul destinaţie este adresat direct la registru

mov ax,[bx] ; încarcă în ax conținutul adresei aflate în bx, adică ; valoarea variabilei a

; operandul sursa adresat indirectadd ax, b ; aduna la ax valoarea variabilei bmov di, offset c ; încarcă în di adresa lui cmov [di], ax ; transferă la adresa lui di, adică în c conţinutul

; lui axmov ax,4c00h; încarcă în ah valoarea 4c, funcţia...int 21h ; intreruperecod endsend start

Exemplul 6. Să se evalueze expresia x+2*y-70, depunând rezultatul la adresa z, unde x, y, z sunt întregi reprezentaţi pe câte un cuvânt. TITLE exemplul_6 .MODEL SMALL .STACK 10H .DATA x DW 100 y DW -10 z DW ? .CODE begin: mov ax,@DATA mov ds,ax mov ax,x ; Se folosește ax ca ; acumulator

21

Page 13: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler add ax,y add ax,y sub ax,70 mov z,ax END begin

Exemplul 7. Sa se efectueze operaţia: dp2 <-- dp1-sp1+sp2 ştiind ca sp1 și sp2 sunt întregi cu semn reprezentaţi în simpla precizie, pe un cuvânt și dp2 este un întreg cu semn în dubla precizie pe doua cuvinte. TITLE exemplul_7 .MODEL SMALL .STACK 10h .DATA dp1 DD 12345678h sp1 DW 170h sp2 DW 180h dp2 DD ? .CODE begin: mov ax,@DATA mov ds,ax mov si,WORD PTR dp1 ; Perechea (si:di) mov di,WORD PTR dp1+2; este folosită ca ; acumulator pe 32 de biţi deoarece (ax:dx) ; se folosește pentru conversii din simpla in ; dubla precizie mov ax,sp1 cwd ; Se converteşte conţinutul registrului ; ax, considerat ca un număr întreg fără ; semn, în dubla precizie, porţiunea cea mai ; semnificativa depunându-se în registrul dx sub si,ax sbb di,dx mov ax,sp2 cwd add si,ax adc di,dx mov WORD PTR dp2,si mov WORD PTR dp2+2,di END begin

Exemplul 8. Sa se schimbe semnul unui număr întreg dp reprezentat în dubla precizie pe doua cuvinte. TITLE exemplul_8 .MODEL SMALL .STACK 10h .DATA dp DW 2 DUP(?) .CODE begin: mov ax,@DATA mov ds,ax mov ax,0 ; Se scade numărul ; respectiv dîn 0 reprezentat pe 32 de biti sub ax,dp mov dp,ax mov ax,0 sbb ax,dp+2

22

Page 14: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler mov dp+2,ax END begin

ExempluL 9. Sa se elaboreze un program pentru implementarea operaţiei: z <-- ((w-x)/10*y)2

unde x, y, z, w sunt întregi cu semn reprezentaţi pe câte un cuvânt. TITLE exemplul_9 .MODEL SMALL .STACK 10h .DATA w DW 200 x DW 100 y DW -1 z DW ? .CODE begin: mov ax,@DATA mov ds,ax mov ax,w ; Se folosește ax ca ; acumulator sub ax,x mov bl,10 idiv bl ; împărțire întreagă, cbw imul y imul ax mov z,ax END begin

Exemplul 10. Se consideră două numere întregi dip și smp, primul reprezentat pe doua cuvinte și al doilea pe un cuvânt. Sa se efectueze înmulţirea dip*smp depunând rezultatul în variabila tp. TITLE exemplul_10 .MODEL SMALL .STACK 10h .DATA smp DW 11h dip DW 11h,22h tp DW 3 DUP(?) ; Rezultat pe trei cuvinte .CODE begin:mov ax,@DATA mov ds,ax mov ax,smp mul dp mov tp,ax mov cx,dx mov ax,dip+2 mul smp add ax,cx mov tp+2,ax mov tp+4,dx END begin

Exemplul 11. Sa se genereze 2 numere a câte 4 cifre zecimale reprezentate în format BCD împachetat (adică fiecare grup de doua cifre zecimale este memorat intr-un octet) și să se scrie o secvenţa de program pentru calculul sumei și diferenţei lor. TITLE exemplul_11 .MODEL SMALL

23

Page 15: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler .STACK 10h .DATA bcd1 DB 34h,18h; 1834 în format BCD ; împachetat bcd2 DB 89h,27h; 2789 în format BCD ; împachetat sum DB2 DUP(?) dif DB2 DUP(?) begin: mov ax,@DATA mov ds,ax mov al,bcd1 add al,bcd2 daa mov sum,al mov al,bcd1+1 adc al,bcd2+1 daa mov sum+1,al mov al,bcd1 sub al,bcd2 das mov dif,al mov al,bcd1+1 sbb al,bcd2+1 das mov sum+1,al END begin

Exemplul 12. Să se scrie o secvenţa de program care sa efectueze armatoarea operaţie u <-- v+(s-6)ştiind ca numerele sunt reprezentate în cod BCD împachetat (vezi enunţul exemplului anterior), cu 2 cifre zecimale. TITLE exemplul_12 .MODEL SMALL .STACK .DATA v DB 56h; 56 s DB 48h; 48 u DB ? .CODE begin: mov ax,@DATA mov ds,ax mov al,s sub al,6 das add al,v daa mov u,al END begin

Exemplul 13. Să se scrie un program pentru adunarea și scăderea a doua numere a câte doua cifre zecimale reprezentate în format BCD neîmpachetat (adică fiecare cifra zecimala se memorează în tetrada inferioară a unui octet): TITLE exemplul_13 .MODEL SMALL .STACK 10h .DATA

24

Page 16: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler upk1 DB 01h,02h; 21 în format BCD ; neîmpachetat upk2 DB 03h,06h; 63 în format BCD ; neîmpachetat sum DB 2 DUP(?) dif DB 2 DUP(?) .CODE begin: mov ax,@DATA mov ds,ax mov al,upk1 add al,upk2 aaa mov sum,al mov al,upk1+1 adc al,upk2+1 aaa mov dif+1,al mov al,upk1 sub al,upk2 aas mov dif,al mov al,upk1+1 sbb al,upk2+1 aas mov dif+1,al END begin

Exemplul 14. Sa se scrie un program pentru împărţirea unui număr întreg pozitiv de trei cifre zecimale reprezentat în format BCD neîmpachetat printr-o cifra zecimala: TITLE exemplul_14 .MODEL SMALL .STACK 10h .DATA dgt DB 03h num DB 07h,05h,04h;754 în format BCD ; neîmpachetat rez DB 3 DUP(?) rest DB ? .CODE start: mov ax,@DATA mov ds,ax mov dl,dgt mov ah,0 mov al,num aad div dl mov rez,al mov al,num+1 aad div dl mov rez+1,al mov al,num+2 aad div dl mov rez+2,al mov rest,ah END start

25

Page 17: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler

Exemplul 15. Să se scrie un program pentru înmulţirea unui număr întreg pozitiv de doua cifre zecimale reprezentat în format BCD neîmpachetat cu o cifra zecimala: TITLE exemplul_15 .MODEL SMALL .STACK 10h .DATA dgt DB 09h ; 9 în format BCD ; neîmpachetat num DB 03h,02h; 23 în format BCD ; neîmpachetat rez DB 3 DUP(?) .CODE begin: mov ax,@DATA mov ds,ax mov dl,dgt mov al,num mul dl aam mov dh,ah mov rez,al mov al,num+1 mul dl aam add al,dh aaa mov rez+1,al mov rez+2,ah END begin

Exemplul 16. Să se scrie un program de conversie a unui număr zecimal de doua cifre sub forma a doua caractere zecimale, și sa se afişeze cele doua caractere pe ecran. Pentru afişare se va utiliza funcţia DOS cu codul 02h, în registrul dl aflându-se codul ASCII al caracterului care se vrea afişat. La apelul unei funcţii DOS în registrul al se va transmite codul funcţiei. TITLE exemplul_16 .MODEL SMALL .STACK 10h .DATA oct DB 25 .CODE start: mov ax,@DATA mov ds,ax mov al,oct aam add ah,'0' add al,'0' mov dx,ax xchg dl,dh mov ah,2 ; Funcţia DOS cu codul 02h int 21h ; se utilizează pentru mov dl,dh; afişarea unui caracter pe int 21h ; ecran, în dl ; transmiţându-se codul ASCII al ; caracterului de afişat mov ax,4C00h; Iesire normala la int 21h ; sistemul de operare

26

Page 18: Assembler 2

Unităţile centrale ale calculatoarelor. Assembler END start

Exemplul 17. Conversia unui întreg fără semn reprezentat pe 16 biţi la un sir de caractere (cifre) în baza 10. Algoritmul de conversie, daca n este numărul, și sir este variabila unde se depun cifrele numărului descris în C este:

adresa = sir;do{

rest = n%10;n = n/10;*sir++ = rest + ‘0’;

}while (n!=0);*sir = 0;inverseaza (adrsir);

Restul furnizează cifra curenta căreia i se adăuga codul ASCII al cifrei 0. Funcţia inversează ordinea caracterelor din şirul generat de algoritm.Implementarea în asamblare arata astfel:

data segmentn dw 7654hsir db 5 dup ("?"),'$'

data endscod segment

assume ds: data, cs:codstart: mov ax,data

mov ds,ax

mov ax,nconvert:

mov cx,0mov bx,10

divide:mov dx,0div bx ; câtul în AX, restul în DX (DL)add dx,'0'push dxinc cxcmp ax,0jnz divide

reverse:pop axmov sir[di],aladd di,1dec cxcmp cx,0jnz reverse

mov dx, offset sirmov ah,9int 21h

mov ax, 4c00hint 21h

cod endsend start

27