Documente Academic
Documente Profesional
Documente Cultură
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.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ă î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
IP CS
Adresa Efectivă.Moduri de adresare
Octetul Octetul
inferior superior
1CD6
Adresare indirectă la memorie prin
registru(continuare)
MOV AX,[BX]
15 0
1A9F
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]
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
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
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
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
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
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
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
Î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