Sunteți pe pagina 1din 67

Ala Gasnaș,lector superior

Catedra ITC
Componentele unei adrese logice
 Pentru executarea oricărui program procesorul se adresează
către memorie , în care se păstrează instrucţiunile şi datele.
 Pentru accesul către date e necesar de determina într-un anumit
mod adresa lor în memorie.
 Modalitatea de formare a adresei unui operand sau a unei
etichete de trecere la altă instrucţiune se numeşte regim de
adresare sau adresare.
 Instrucţiunile limbajului de asamblare includ cele mai diverse
comenzi, care lucrează atât cu operanzi cât şi fără ei. Unele
comenzi necesită indicarea explicită a operanzilor în timp ce
altele utilizează operanzii tacit.
 Datele operandului sursă pot să se afle în registru , memorie, în
portul intrare/ieşire, sau să fie indicate direct în instrucţiuni.
 Operandul destinaţie poate fi plasat în memoria operativă,
registru, sau să fie portul intrare /ieşire.
Componentele unei adrese logice
(continuare)
 Adresa operandului este creat după schema segment:
deplasament .
 În modul real specificarea unei adrese se face numai
prin 16 biţi consideraţi ca fiind poziţia locaţiei
respective de memorie faţă de baza segmentului în
care se află. Acest deplasament de 16 biţi formează
adresa efectivă .
Componentele unei adrese logice
(continuare)

AL=AS*16+AE

Segm.2 Locația vizată

Adresa efectivă (AE)

Segm.1
Adresa logică (AL)
Adresa bază segment (ABS)
Componentele unei adrese logice
(continuare)
 Adresa logică se calculează după formula:
AL=AS*16+AE
 AL este adresa logică ce coincide cu adresa fizică transmisă pe
magistrala de adrese.
 AE – este adresa efectivă , ce indică poziţia în interiorul unui
segment, adică deplasamentul faţă de baza segmentului .
 AS- adresa de segment ce se conţine în următoarele registre:
CS,DS,SS,ES. Registrul se alege în dependenţă de tipul operaţiei
executate
 Procesorul alege singur segmentul in dependenţă de condiţii.
 AS nu coincide cu adresa bazei segmentului.
 Adresa bazei segmentului (ABS) se obţine prin deplasarea
adresei de segment cu 4 biţi spre stânga (înmulţire cu 16=24)
ABS= 16*AS
Componentele unei adrese logice
(continuare)
 Registrul se alege în dependenţă de tipul operaţiei executate:
Tipul de operaţie Registrul segment Descriere
se utilizează pentru comenzile
Comenzile procesorului CS
procesiorului

se utilizează pentru operaţiile


cu stiva, la fel şi în operaţiile
Adresare către stivă SS
cu memoria, in care registrele
de bază sunt SP şi BP

se utilizează în operaţiile cu
datele în afară de cele care
Datele locale DS
utilizează stiva sau in
operaţiile cu şiruri
Operaţiile cu şiruri ES operaţiile cu şiruri
Componentele unei adrese logice
(exemple)
 Orice operand înscris în paranteze drepte, reprezintă o adresă de
memorie.
 Exemplu:
[2B67]
reprezintă conţinutul locaţiei de memorie cu adresa efectivă 2B67;
[BX+ DI]
reprezintă conţinutul locaţiei de memorie cu adresa efectivă dată de
suma registrelor BX şi DI.
 Este permisă scrierea RG[const], sau const[RG] unde RG este un
registru general iar const este un deplasament, care se adună la
conţinutul acestui registru. Aceasta este echivalent cu [RG+ const] .
 Exemplu:
mov AX,BX[20h ] ,
încarcă în AX conţinutul locaţiei de memorie a cărei adresă efectivă
este suma între conţinutul lui BX şi const 20h, iar adresa de segment se
conţine în DS.
Componentele unei adrese logice
(exemple)
 În cazuri speciale se foloseşte şi adresa fizică:
AF= AS: AE
Exemplu:
MOV AH,DS:[20h]
transferă în AH conţinutul locaţiei 20h din segmentul a
cărui adresă se găseşte in registrul DS.
 Exemplu:
MOV SS:[BX+20h],CL
transferă conţinutul lui CL, în locaţia a cărei adresă este
dată de conţinutul lui BX adunat cu 20h din segmentul a
cărei adresă este conţinută în SS.
Componentele unei adrese efective.
 Există cîteva modalităţi de formare a adresei efective .
Această adresă este alcătuită din :
 deplasamentul , care reprezintă o valoare de 8, 16, sau 32 locaţii
 baza, care reprezintă conţinutul unuia din registrele cu destinaţie
comună
 indexul, care reprezintă conţinutul unuia din registrele de index
 AE se alcătuieşte după formula generală:
AE= (BX/BP)* + (SI/DI)* + (D8/D16)
unde * - indică un termen opţional
/ - separă variantele unui termen
BX şi BP sunt registrele de tip bază ;
SI şi DI sunt registrele index;
D8 şi D16 reprezintă un deplasament pe 8 sau 16 biţi
Componentele unei adrese efective
(continuare).
 Remarcă : Baza ,indexul şi deplasamentul pot fi utilizate în orice
combinaţie şi orice componentă poate lipsi.
 Asamblorul nu acceptă AE specificată numai ca o constantă
numerică, deoarece nu poate şti registrul de segment implicit.
 Se vor folosi forme de sumare cu un registru ,care în prealabil a
fost adus la 0.
 Exemplu:
în loc de :
MOV AL, [2000]
se va scrie:
MOV AL, [BX+ 2000]
iar BX a fost făcut în prealabil 0.
Componentele unei adrese efective
(continuare).
 În funcţie de registrele generale folosite în formarea
adresei efective ,registrele de segment implicite sunt:
Registrul general Registru de segment
implicit
SP SS
BP SS
BX DS
SI DS
DI ES

BP+SI sau BP+DI SS

BX+SI sau BX+DI DS

IP CS
Adresa Efectivă.Moduri de adresare

 În funcţie de termenii folosiţi în formula generală a adresei


efective, se definesc următoarele moduri de adresare.
 Adresarea imediată la memorie.
 Adresarea directă
 Adresare indirectă la memorie prin registru
 Adresare indirectă la memorie prin registru cu
deplasare
 Adresare indirectă la memorie prin 2 registre
 Adresare indirectă la memorie prin 2 registre cu
deplasare
Moduri de adresare. Adresarea imediată la
memorie.
 În adresarea imediată la memorie în formarea adresei
efective se specifică doar deplasamentul, fără implicarea
oricăror registre.
 Exemplu:
MOV AX,DS:[54]
încarcă în AL conţinutul locaţiei cu adresa efectivă 54 din
segmentul de date , iar în AH conţinutul locaţiei următoare.
 Adresa efectivă poate specificată printr-o etichetă , care a fost
declarată anterior cu ajutorul instrucţiunii EQU şi a instrucţiunii
de atribuire.
 Exemplu:
ADR1 EQU 20h
ADR2 EQU ADR1+2
ADR3 =30h
........
MOV AL,DS:[ADR1] ; încarcă în AL conţinutul
locaţiei de memorie la adresa 20 h din segmentul de date DS
Moduri de adresare. Adresarea directă la
memorie.
 În cazul când se utilizează o locaţie declarată în cadrul
segmentului de date nu se utilizează parantezele drepte şi un alt
registru . Adresa de segment este conţinut implicit în DS
 Exemplu:
.MODEL SMALL
. STACK 100h
. DATA
mem1 DW 2233 ; stabileşte adresa la începutul
segmentului DS
.CODE
MOV AX,@data
MOV DS,AX
MOV AX,mem1
Moduri de adresare. Adresarea directă la
memorie (continuare).
 Instrucţiunile ce urmează după directiva .CODE, din acest
exemplu,sunt necesare întotdeauna atunci când se declară
un segment de date. Acest segment este plasat acolo unde
este memorie liberă ,şi adresa lui se încarcă explicit în
registrul segmentului de date DS .
 Registrul DS nu admite o încărcare cu o constantă. De
aceea se încarcă în registru prin simbolul @data, care este
recunoscut de asamblor .La început într-un registru
general apoi se transferă în registrul DS.
 Operandul mem1 şi operandul – destinaţie AX trebuie să
fie de aceeaşi lungime în caz contrar vom avea o greşeală .
Moduri de adresare. Adresarea directă la
memorie (continuare).
 În cazul când variabila mem1 este declarată ca un cuvînt dublu
(32 biţi) iar operandul – destinaţie este registrul AX (16 biţi) ,
atunci în comanda limbajului de asamblare e necesar de indicat
în mod explicit care parte a cuvântului dublu este încărcat în
registru: cea inferioară sau cea superioară cu ajutorul
instrucţiunii PTR
 Exemplu :
MOV AX, word ptr mem1
 Dacă mem1 este o variabilă de tipul DWORD cu valoarea:
1D7FEC34h atunci instrucțiunea de mai sus va încărca în AX
valoarea cuvântului inferior:
 Byte inferior Byte superior
7F 1D 34 EC
Moduri de adresare. Adresarea directă la
memorie (continuare).
 În registrul AX va fi 1D7Fh .
 Dacă în registrul AX e necesar de a păstra valoarea cuvântului
superior atunci vom scrie:
MOV AX, word ptr mem1+2
 În acest caz în AX se va încărca cei 2 byte superiori a variabilei
mem1 .
În rezultat în AX vom avea :0EC34h(ordinea este inversată).
 Instrucţiunea PTR are următorul format:
Tipul PTR expresie
Tipul poate lua valorile : BYTE, WORD, DWORD, QWORD,
TBYTE.
Instrucţiunea PTR se utilizează pentru accesul către un anumit
obiect.
Adresare indirectă la memorie prin registru

 În adresarea indirectă la memorie prin registru în


instrucţiune se specifică registrul din care se va lua
adresa efectivă. Registrul este unul din următoarele:
BX,BP,SI,DI.
 Exemplu:
LEA BX,mem1
MOV AX,[BX]
 Aici mem1 e o variabilă în memorie cu mărimea de un
cuvânt. Prima instrucţiune încarcă adresa variabilei în
registrul BX, iar a doua transferă în registrul AX
valoarea ce se află pe adresa indicată din registrul BX.
Adresare indirectă la memorie prin
registru(continuare)
 Grafic acest lucru se va prezinta ca :
Mem1
1CD5 1CD6 1CD7
9F 1A

Octetul Octetul
inferior superior

LEA BX, mem1


15 0

1CD6
Adresare indirectă la memorie prin
registru(continuare)
MOV AX,[BX]
15 0
1A9F

 După executarea primei instrucţiuni în registrul BX se încarcă


adresa variabilei mem1 , care este adresa primului element al
variabilei. Instrucţiunea a doua transferă in registrul AX valoarea
acestei variabile.
 Exemplu:
MOV [BP], CX
 Încarcă conţinutul lui CL în locaţia de memorie a cărei adresă
efectivă este conţinută în BP şi adresa de segment conţinută
implicit în SS , iar conţinutul lui CH în adresa de memorie
următoare.
 Această adresare este utilizată pentru structurile dinamice ca de
exemplu şiruri şi tabele.
Adresare indirectă la memorie prin registru
cu deplasare
 În adresarea indirectă la memorie prin registru cu deplasare
adresa efectivă se formează dintr-un registru şi deplasament.
 Acest tip de adresare este comod în accesul către elementele
unui tabel mărimea căruia nu este divizibil cu 2. În acest caz
registrul conţine adresa tabelului, iar deplasamentul dă accesul
către un element arbitrar al tabelului.
 Exemplu:
...
S1 DB ‘STRING 1’
...
LEA BX,S1
MOV AL, byte ptr [BX]+5
 Prima instrucţiune încarcă în registrul BX adresa şirului care
concomitent este şi adresa primului element (cu indicele 0).
Adresare indirectă la memorie prin registru
cu deplasare(continuare)
 Algoritmul acestui fragmentului de mai sus este următorul:
S1
S T R I N G 1
1C5 1C6 1C7 1C8 1C9 1CA 1CB 1CC

LEA BX,S1
1C5

+ 5
MOV AL, byte PTR 5[BX]
AH AL
? G
Adresare indirectă la memorie prin registru
cu deplasare(continuare)
 Exemplu:
MOV AL,[DI+31]
se transferă în AL conţinutul locaţiei a cărei adresă este dată de
conţinutul lui DI+31, iar adresa de segment este dată de ES;
 Exemplu:
MOV [BP+1226] , CX
transferă CL în locaţia adresa căreia este dată de conţinutul BP
la care se adună 1226,iar CH în locaţia imediat următoare .
Adresa de segment este dată de SS.
 Aceste instrucţiuni se mai pot scrie şi:
MOV AL,31[DI]
MOV 1226[BP],CX
Adresare indirectă la memorie prin 2
registre
 În acest caz adresa efectivă este dată de suma a 2 registre
specificate de instrucţiune.
 Registrul de segment implicit este DS cu excepţia când
este menţionat BP, în acest caz segmentul este cel de stivă
cu adresa conţinută în SS.
 Modul de adresare prin 2 registre se recomandă pentru
adresarea elementelor şirurilor şi tabelelor.
 Exemplu:
încărcăm constanta numerică într-un registru de bază
MOV BX,2100
Adresăm elementul de tabel cu numărul conţinut în SI
prin instrucţiunea :
MOV CX, [BX+SI]
Adresare indirectă la memorie prin 2
registre cu deplasare
 În adresarea indirectă la memorie prin 2 registre cu deplasare
adresa efectivă este dată de suma a 2 registre şi un deplasament.
 Registrul de segment implicit este DS cu excepţia când este menţionat BP cu
adresa conţinută în SS.
Exemplu:

MOV CX,[BX+SI+2C]

 O astfel de adresare este utilizată la adresarea în tabelele bidimensionale.


 Exemplu:
Se dă o matrice din 5 linii şi 6 coloane, care începe la adresa 20h. Dacă se
doreşte accesarea elementului al 3 din linia 4 se va scrie
TAB= 20h
MOV BX,18 ; numărul primului element din lina 4 (se începe de la 0)
MOV SI,3 ; elementul al 3 –lea
MOV CL, TAB[BX+SI] ; adunăm 20+ 18+3
Structura programelor în limbaj de
asamblare
 .MODEL SMALL
 .STACK 100h
 .DATA ; începutul segmentului de date
 ...
 ; datele
 ...
 .CODE ; începutul segmentului codului de programă
 main:
 ...
 ; instrucţiunile în assembler
 ...
 end main
 end
Problemă

 De scos la ecran şirul S1


 . model small
 . stack 100h
 . data
 S1 DB ‘TEST STRING$’
 .code
 start:
 mov AX,@data
 mov DS, AX
 lea DX,s1
 mov AH,9h
 int 21h
 mov AX,4C00h
 int 21h
 end start
 end
Instrucţiunile de transfer şi schimb
de informaţie
Instrucţiunea de transfer MOV

Această instrucţiune are următorul format :


 MOV dst , src
 unde dst –destinaţie ,iar src - sursa
 Acţiune: destinaţie ia valoarea sursei
 Dst←src
 Dst poate lua valorile: r8, r16, r32, rs, mem8, mem16
 Src poate lua valorile: r8, r16, r32, mem8, mem16, nn,
nnnn
Exemplu

 dst - r8 , src - r8
 MOV AL,AH
 dst - r16 , src - r16
 MOV AX,DX
 dst - r8 , src - mem8
 k DB 10
 ….
 MOV CL,k
 dst - r16, src - mem16
 K1 DW 3425
 ...
 MOV BX,K1
 dst - r8, src - const
 MOV AL,15
 dst - mem 8, src - r8
 M DB ?
 MOV M,CL
Excepţii pentru instrucţiunea MOV

Nu sunt posibile transferuri de tip:


1.Transferuri între registre de segment
MOV rs,rs
MOV ES,DS ;nu e admis.
Va fi înlocuit cu :
MOV AX,DS
MOV ES,AX
2. În calitate de destinaţie nu poate fi registrul CS
 MOV CS,* ;nu e admis
Problemă

Să se înscrie în registrele AL, BL constantele 88 şi AA iar în


CX constanta 6647

Rezolvare:
 .MODEL SMALL
 . STACK 100H
 . CODE
 START: MOV AL,88h
 MOV BL, 0AAh
 MOV CX, 6647h
 TERM: JMP TERM
 END START
 END
Instrucţiunea XCHG - interschimbare între
registre
Sintaxa:
 XCHG dst, src
 Acţiune: se schimbă între ele conţinutul registrelor
 Dst ← src
 Src ← dst
 Dst poate lua valorile: r8, r16, r32
 Src poate lua valorile: r8, r16, r32
 XCHG AX,DX
 Excepţii: nu există operanzi de tipul
 XCHG rs , rs
 XCHG CS,*
Problemă
Să se încarce în registrul AX constanta 11AA, în BX constanta
5544 să se inter schimbe conţinutul acestor registre.
 .MODEL SMALL
 . RADIX 16
 . STACK 100H
 . CODE
 start: MOV AX,11AA
 MOV BX, 5544
 XCHG AX,BX
 term : JMP term
 end start
 end
Instrucţiunea de încărcarea adresei

 LEA
 Sintaxa:
 LEA dst , src
 Dst poate lua valorile: r16,r32
 Src poate lua valorile: mem16,mem32
 Acţiune: destinaţie ia valoarea sursei
 Dst←src
Exemplu

 ...
 s1 DW 1000
 ...
 LEA DI,S1
 ...
 Această instrucţiune se foloseşte atunci când trebuie
specificată o adresă care a fost calculată de asamblor şi
nu este cunoscută numeric.
Problema 1

1. Să se încarce următoarele registre astfel: Al cu 11, BL cu 73,


CX cu 2345, DX cu 1234. Să se interschimbe conţinutul
registrelor celor de 8 biţi şi celor de 16 biţi.
 .model small
 .stack 100h
 .radix 16
 .code
 start:
 mov AL,11
 mov BL,73
 mov CX,2345
 mov DX,1234
 XCHG AL,BL
 XCHG CX,DX
 term:jmp term
 end start
 end
Problema 2
1. Să se înscrie în registrele AH constanta 23, iar în BH constanta CC.
Să se facă interschimbarea acestor registre utilizînd doar
instrucţiunea MOV.
 .model small
 .stack 100h
 .radix 16
 .code
 start:
 mov AH,23
 mov BH,0CC
 mov CL,AH
 mov AH,BH
 mov BH,CL
 term:jmp term
 end start
 end
Instrucţiunile aritmetice
Instrucţiuni de adunare

 Sintaxa:
 ADD dst,src ,
 Dst poate lui valorile: r8, r16, r32,m8,m16,m32
 Src poate lui valorile: r8, r16, r32, m8, m16, m32, n,
nn, nnnn
 Logica de lucru:
 dst=dst+src
 ...
 MOV AL,12
 ADD AL,10
 MOV X,AL
 ...
Instrucţiuni de adunare

 Pentru numerele cu 16 locaţii adunarea este


echivalentă cu cea pentru 8 locaţii, dar utilizează
registrele de 16 locaţii
 ...
 MOV AX,120
 ADD AX,100
 MOV X1,AX
 ...
Instrucţiunea ADC (adunare cu transport)

 Sintaxa:
 ADC dst, src
 Dst poate lui valorile: r8, r16, r32, m8, m16, m32,
 Src poate lui valorile: r8, r16, r32, m8, m16, m32, n, nn,
nnnn
 Logica de lucru:
 dst=dst+src+CF
Instrucţiunea INC

 Sintaxa:
 INC operand
 Logica de lucru:
 operand=operad+1,
 Operand ia valorile : r8, r16, mem8, mem16, mem 32
 Ex:
 ...
 INC CL
 ...
 INC AX
 ...
 INC I
 ...
Instrucţiunile de scădere

 SUB
 Sintaxa:
 SUB dst, src
 Dst poate lui valorile: r8, r16, r32, m8, m16, m32
 Src poate lui valorile: r8, r16, r32, m8, m16, m32, n, nn,
nnnn
 Logica de lucru:
 dst=dst-src;
Instrucţiunile de scădere

 SBB
 Sintaxa:
 SBB dst , src
 Dst poate lui valorile: r8, r16, r32, m8, m16, m32
 Src poate lui valorile: r8, r16, r32, m8, m16, m32, n, nn,
nnnn
 Logica de lucru:
 dst=dst-src-CF;
Instrucţiunile de scădere
DEC
 Sintaxa:
DEC operand
 Operand ia valorile : r8, r16, mem8, mem16
 Logica de lucru:
operand=operad-1,
 Exemplu:
...
DEC AL
...
Instrucţiunile de scădere
 NEG
 Sintaxa:
 NEG operand
 Logica de lucru:
 operand = - operand
 Operand poate fi:R8 , R16 , mem8 , mem16.
 Ex:
 pentru a calcula <AL>=50-<AL> , se scrie:
 ...
 NEG AL
 ADD AL,50
 ...
Problema 3
 Să se încarce 2 numere de 32 de biţi în felul următor: primul număr
55667788 octeţii superiori în AX , în BX- octeţii inferiori .Al doilea număr
99AABBCC să se încarce octeţii superiori în CX, în DX-octeţii inferiori.
 să se adune aceste 2 numere.
 .model small
 .stack 100h
 .radix 16
 .code
 start:
 mov AX,5566
 mov BX,7788
 mov CX,99AA
 mov DX,0BBCC
 add BX,DX
 adc AX,CX
 term:jmp term
 end start
 end
Comparația aritmetică
 Instrucțiunea comparația aritmetică CMP
 Sintaxa:
CMP dst,src
Acțiune:
dst-src
dst ia valorile: r8,r16, r32,mem8,mem16,mem32
src ia valorile: r8,r16, r32,mem8,mem16,mem32
Se face diferența intre dst și src fără generare de rezultat
Se modifică doar indicatorii de condiții.
Sursa și destinația trebuie să fie de dimensiuni egale.
Nu este admis ca ambii operanzi să fie localizați în memorie
Instrucţiunile de înmulţire

 MUL -înmulţirea fără semn


 IMUL -înmulţirea cu semn
 Sintaxa:
 MUL src
 IMUL src
 Logica de lucru:
 produsul=deînmulţitul*src_înmulţitorul
 src_înmulţitorul poate lua valorile: r8 , r16 , mem8 ,
mem16
 Constantele nu sunt admise.
Operanzii ne evidenţi ai instrucţiunilor MUL
şi IMUL

Lungimea Deînmulţitul Produsul


sursei

Byte AL AX(<AH:AL>)

Word AX <DX:AX>
Problema 4
 Să se încarce DX cu 1122, CX cu 50. Să se înmulţească DX cu CX.
Rezultatul să se adune cu conţinutul lui DX iniţial

 .model small
 .stack 100
 .radix 16
 .data
 var1 dw ?
 .code
 start: mov AX,@data
 mov DS,AX
 mov DX,1122
 mov var 1,DX
 mov AX,DX
 mov CX,50
 mul CX
 add AX,var 1
 term:jmp term
 end start
 end
Instrucţiunile de împărţire

 DIV-împărţirea fără semn


 IDIV-împărţirea cu semn
 Sintaxa:
 DIV src
 IDIV src
 Logica de lucru:
 Cît:rest=deîmprţitul/src_împărţitor.
 În calitate de împărţitor poate fi: r8, r16, mem8
,mem16.
 Constantele nu sunt admise .
Instrucţiunile de împărţire

Lungimea Deîmpărţitul Rezultatul


src_împărţit
orului Cît Rest

Byte AX(<AH:AL>) AL AH

Word <DX:AX> AX DX
Problemă 5
 Să se încarce AX cu 3366 , CX cu 1122, iar BX cu AA11. Să se împartă
AX cu CX iar cîtul să se adune cu conţinutul lui BX.

 .model small
 .stack 100h
 .radix 16
 .code
 start:
 mov AX,3366
 mov CX,1122
 mov BX,0AA11
 div CX
 add AX,BX
 term:jmp term
 end start
 end
Instrucţiunile de lucru cu stiva

 PUSHx- păstrarea informaţiei în stivă


 POPx- restabilirea informaţiei din stivă
 Aceste instrucţiuni lucrează în pereche.
 Se ştie că stiva se completează invers , adică în direcţia
adreselor mici. Deaceea toate instrucţiunile PUSHx la început
micşorează valoarea indicatorului de stivă <SP>=<SP>-2
(registrul SP indică vîrful stivei), iar apoi copie în stivă operanzii.
 Sintaxa:
PUSH rs,
unde rs – registru sursă
SP←SP-2
[SP]←rsL
[SP+1]←rsH
Instrucţiunile de lucru cu stiva(continuare)

 Sintaxa:
POP rd ,
unde rd- registru destinaţie
 Mai întîi conţinutul registrului destinaţie - dublu rd este
încărcat din stivă de la adresa specificată , apoi registrul SP se
măreşte cu 2
rdL←[SP]
rdH←[SP+1]
SP←SP+2
 Lucrul cu stiva prin instrucţiunile PUSH şi POP este comod ,
deoarece nu necesită calculul sau specificarea adresei de
memorie.
 Trebuie să se ţină cont însă, de ordinea în care au fost salvate
registrele în stivă, deoarece dacă dorim refacerea lor , încărcarea
trebuie făcută în ordine inversă.
Instrucţiunea PUSHA şi POPA

 Instrucţiunea PUSHA memorează toate registrele în


stivă strict în următoarea
consecutivitate:AX,CX,DX,BX,SP,BP,SI,DI.
 Instrucţiunea POPA invers , scoate toate aceste
registre din stivă:DI,SI,BP,SP,BX,DX,CX,AX.
 Sintaxa:
PUSHA
POPA
 Aceste instrucţiuni nu au nevoie de operanzi.
Instrucţiunile PUSHF şi POPF

 Aceste instrucţiuni memorează prin PUSHF sau


restabilesc prin POPF registrul de flaguri FLAGS
utilizînd stiva.
PUSHF
POPF
 Aceste instrucţiuni la fel nu utilizează operanzi.
Instrucţiunile de lucru cu stiva
 Exemplu: Să se încarce registrul AX cu 1122, BX cu 3344, CX cu 5566 și DX cu 7788 . Să se
facă permutarea circulară a acestor regisre AX ia valoarea lui BX, BX a lui CX ,CX a lui DX
iar DX a lui AX .
.model small
.stack 100h
.code
Start: mov ax,1122
mov bx,3344
mov cx,5566
mov dx,7788
push ax
push bx
push cx
push dx
pop cx
pop bx
pop ax
pop dx
Term: jmp term
end start
end
Operaţiile de bază în lucrul cu biţii
Operaţii logice
 Pentru limbajul de asamblare noţiunea de tip de date ca în
alte limbaje de programare nu există. Deaceea operaţiile cu
biţii se referă la fiecare bit al octetului sau a cuvîntului în
parte, începînd cu bitul inferior 0 şi finisînd cu cel
superior.
 În limbajul de asamblare instrucţiunile logice realizează 4
operaţii de bază ale logicii matematice:
Negaţia logică (NOT)
Înmulţirea logică(AND)
Adunarea logică(OR)
Adunarea după modulul 2 (XOR)
Operaţii logice(continuare)

 Negaţia logică este o operaţie cu un singur operand .


NOT dst
-complementare faţă de 1 a fiecărui bit din
operandul destinaţie , dstn
Acţiune dstn ←1-dstn
Operanzi: dst
 Instrucţiunea NOT inversează biţii operandului: orice
1 devine 0 şi invers.
 Această instrucţiune nu schimbă conţinutul registrului
de flaguri.
Operaţii logice(continuare)

 Înmulţirea logică
AND dst , src
ŞI logic pe bit
Acţiune dst←(srcn) şi (dstn)
Operanzi : dst , src.
 Un bit al rezultatului instrucţiunii AND este 1 , dacă ambii biţi
corespunzători sunt 1, altfel bitul devine 0.
 S-a notat cu srcn şi dstn bitul n al operandului sursă şi respectiv
destinaţie.
 Rezultatul înlocuieşte primul operand. 0 1
0 0 0
1 0 1
Operaţii logice(continuare)

 Instrucțiunea TEST
TEST dst , src
testare ŞI fără generare de rezultat
Operanzi dst , src
 Instrucţiunea TEST calculează „ŞI logic pe bit” între cei 2 operanzi. E
la fel ca şi operaţia AND , adică est 1 cînd ambii biţi sunt 1 , altfel e 0,
dar rezultatul operaţiei este şters şi se modifică doar flagurile.
 Se utilizează pentru compararea logică a operanzilor cu transferul
condiţionat ulterior.
0 1
0 0 0
1 0 1
Operaţii logice(continuare)

 OR-dst , src
 - SAU logic pe bit
 Acţiune dstn←(srcn) SAU (dstn).
 Operanzi dst , src
 Instrucşiunea OR calculează SAU pe bit între cei 2 operanzi şi
rezultatul este plasat în primul operand.
 Un bit al rezultatului este 0 , dacă ambii biţi corespunzători sunt 0 ,
altfel bitul este 1.
 Rezultatul înlocuieşte un operand . Această operaţie e utilizată pentru
instalarea în biţii necesari 1.
0 1
0 0 1
1 1 1
Operaţii logice(continuare)
 XOR – dst , src
SAU EXCLUSIV logic pe bit
Acţiune : dstn←(srcn) XOR(dstn).
Operanzii: dst , src.
 Instrucţiunea calculează SAU exclusiv pe bit între cei 2 operanzi.
 Un bit al rezultatului primeşte valoarea fals(0) în 2 cazuri: cînd
biţii corespunzători ai operanzilor sunt identici (sau ambii 0 sau
ambii 1) , şi bitul rezultatului este egal cu 1 tot în 2 cazuri , dacă
biţii corespunzători ai operanzilor sunt diferiţi.
 Această operaţie de regulă este utilizată pentru a primi valoarea
0 în biţii necesari dacă ei au valoarea 1.
0 1
0 0 1
1 1 0
Exemplu
 Problemă:
 Să se scrie un program care transformă în 1 biţii lui AX=0EEEEh
cu excepţia biţilor 4...7 rezultatul acestei mascări să se
memorizeze în DX.
.Model small
.radix 16
.stack 100h
.code
start:
mov AX,1110111011101110b
or AX,1111111100001111b
mov DX,AX
term:jmp term
end start
end

S-ar putea să vă placă și