Documente Academic
Documente Profesional
Documente Cultură
modurile de adresare
ale memoriei
(Cursul 2)
1
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Introducere
Subiectele prelegerii:
2
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Registrele CPU
CPU-ul
Unitatea Centrală de Procesare (CPU abreviere de
la Control Process Unit) este componenta
fundamentală şi nelipsită a oricărui sistem PC
(numărul minim de procesoare pentru a exista un
sistem PC este unu)
În esenţă este un microprocesor complex a cărui
sarcină principală este să proceseze date dintr-o
memorie internă RAM, în funcţie de instrucţiunile
stocate de asemenea în memoria internă RAM
Cu toate acestea, CPU-ul conţine un fel de
memorie internă rapidă formată din totalitatea
registrelor de care dispune acesta
3
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Registrele CPU
Registrele
Registrele pot fi utilizate de programator/utilizator ca o
“tăbliţă de scris” pentru a efectua calcule sau alte
sarcini care trebuie efectuate în cadrul CPU
Toată familia de microprocesoare 80X86 dispune de
registre de 14, 16 (↓80286) sau 32 şi 64 (80386↑),
registre care se află în mod constant la dispoziţia
utilizatorului
Începând cu 80386, Intel a adăugat un nou set de
registre pe 32 de biţi şi instrucţiuni care lucrează cu ele
Totuşi, în acest curs ne vom opri numai asupra a ceea
ce Intel a numit operaţii în “mod real” a CPU
4
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Registrele CPU
Operaţie Real Mode
• Modul special numit Real Mode transformă
orice familie CPU 8086 într-un mod de compatibilitate
cu microprocesorul standard 8086 (chiar si
microprocesoarele Pentuim IV au implementate acest
mod)
• În acest mod, utilizatorului îi este permis accesul
la numai 14 registre de bază de 14 biţi, 1Mb de RAM şi
64 Kb de spaţiu I/O
• Odată ce această parte a fost însuşită, abilităţile
de bază şi cunoştinţele necesare pentru a înţelege CPU-
urile (chiar şi cele ce vor urma să vină în viitor) sunt
mai scăzute, cum ar fi 80386, 80486, Pentium-uri,
Pentium II-uri cu MMX etc. vor fi uşor dezvoltate
5
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Componente CPU
Componente de bază
Registre şi Flag-uri
Unitatea aritmetică şi
Logică ALU
Deplasări şi rotaţii
Module de decodare
a adreselor
Componente avansate
Co-Procesor Matematic
Data & Program Pipelines
Caches
Decodor de instrucţiuni mico-cod
Procesor Extensie
Multimedia (MMX)
Etc. 6
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Organizarea memoriei
1 Mb RAM
În mod real, familia de CPU 8086 poate adresa
maximul 1Mb de RAM
Din punct de vedere conceptual această memorie poate
fi considerată ca o zonă continuă de octeţi de memorie
(unitatea minimă de acces la memorie este octetul)
începând de la adresa 00000h până la FFFFFh
În practică, această memorie este segmentată în
blocuri de 64 Kb, blocuri notate de la 0000h la FFFFh
Acest lucru a fost făcut pentru a păstra
compatibilitatea cu procesoarele timpului 8085, care
aveau doar 16 linii de adresare, oferind acces la 64 Kb
de memorie (216 = 64 Kb)
7
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Organizarea memoriei
8
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
9
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrele de date (AX, BX, CX, DX)
Sunt registre cu scop general – pentru calcule aritmetice, stocare
temporară de date, transfer de date etc.
Registrul Acumulator AX(AH/AL)
Registrul cel mai utilizat
Folosit în instrucţiuni de tip şir de caractere (STOSB, STOSW etc.)
pentru a reşine datele care sunt transferate
Utilizat în instrucţiuni I/O (IN, OUT) pentru reţine datele care sunt
transferate
Folosit la instrucţiunea de înmulţire (MUL) sau la împărţire
( DIV) pentru a reţine datele înainte de execuţia instrucţiunii si
pentru a reţine rezultatul după executarea acesteia
Folosit la instrucţiuni pe şiruri şi BIOS pentru a reţine valori
ASCII şi ATTRIBUTE atunci când se scrie pe ecran în modul text
10
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrele de date (AX, BX, CX, DX)
Registrul de bază BX (BH/BL)
Utilizat la mai multe instrucţiuni în modul de adresare bazată
pentru a reţine adresa bazei unui bloc de date ce urmează a fi
manipulat
Un bloc conţine în general unele date cu aceleaşi caracteristici, de
exemplu, un mesaj în ASCII de imprimat
Registrul de contorizare CX (CH/CL)
Utilizat în instrucţiuni cum ar fi REP şi LOOP ca numărător
(contor), de exemplu: dacă se introduce în CX valoarea 10,
atunci instrucţiunea LOOP ce urmează va executa o buclă de 10
ori, scăzând în mod repetat din CX valoarea 1 (decrementare
executată la fiecare parcurgere a buclei) până se ajunge la
valoarea zero când se încheie bucla
De asemenea este folosit în instrucţiunile de deplasare (SHR,
SHL) şi re rotaţii (ROR, ROL) pentru precizarea numărului de
deplasări şi rotaţii 11
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
12
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Contorul (pointer-ul) de instrucţiuni (IP)
Un registru de 16 biţi care arată întotdeauna adresa din RAM a
viitoarei instrucţiuni ce urmează a fi executată
Dacă, de exemplu, se execută o instrucţiune pe doi octeţi aflată la
adresa 0100h, atunci în IP se află valoarea 0102h, adică (în
momentul curent) adresa viitoarei instrucţiuni ce urmează a fi
executată în secvenţă
IP poate conţine valori cuprinse între 0000h (0000 zecimal) şi
FFFFh (65535 zecimal)
Aceasta înseamnă că CPU-ul poate accesa numai până la 64 Kb
din instrucţiuni, dacă se foloseşte doar IP-ul pentru adresare
Registrul IP lucrează întotdeauna împreună cu registrul CS
(Code Segment) pentru a se genera adresa fizică de memorie
(perechea CS:IP)
13
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Contorul (pointer-ul) de instrucţiuni (IP)
Unele instrucţiuni de program pot fi modificate pentru a
produce execuţia unor secţiuni de cod diferite
Instrucţiunea de salt necondiţionat (JMP) alterează IP-ul
pentru a indica adresa instrucţiunii unde se face saltul
necondiţionat
Instrucţiunea de apel a unei proceduri (CALL) de asemenea
alterează IP-ul pentru a indica adresa relativă a noii locaţii de
memorie unde se află prima instrucţiune din procedură, dar
valoarea curentă din momentul apelului (adică adresa relativă
a primei instrucţiuni de după CALL) este automat salvată în
stivă, de unde va fi luată de instrucţiunea RET (ultima
executabilă în procedură) care reface din stivă IP-ul dinaintea
apelului
Şi întreruperile modifică conţinutul IP-ului care va indica
adresa relativă din rutina de tratare a întreruperii
14
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrele de segment (CS, DS, SS, ES)
Aceste registre sunt folosite deoarece IP este numai de
16 biţi lungime, în timp ce spaţiul de memorie RAM
adresabil (în modul real) este de 1Mb = 220 = 216+4
lungime
Adresa fizică actuală (adresă absolută) din RAM se
calculează ca:
(SEGMENT * 16) + IP , i. e. (in extenso) Segment &
Offset
De exemplu, dacă CS = 07A0 şi IP = 0100 atunci
adresa fizică = 07A00 + 0100 = 07B00
Notă: Aceiaşi adresă fizică se poate exprima prin mai
multe combinaţii de segment şi pointer, de exemplu:
07B00 = 07A0:0100 sau 07B0:0000
15
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrele de segment (CS, DS, SS, ES)
Registrul Code Segment (CS)
Utilizat pentru a defini segmentul de cod, unde se află instrucţiunile
de executat ale programului curent. Adresa conţinută de acest
registru este folosită ca bază de adresare pentru segmentul de cod.
În timpul execuţiei programului CS conţine adresa fizică absolută a
începutului segmentului de cod, iar IP va conţine adresa relativă
(offset) faţă de începutul segmentului de cod pentru viitoarea
instrucţiune ce urmează a fi executată
Registrul Data Segment (DS)
Folosit pentru a defini segmentul de date (constante şi variabile)
unde se află toate datele programului
Registrul Stack Segment (SS)
Folosit pentru a defini segmentul de stivă (o zonă de stocare
temporară a conţinutului registrului, adresa de returnare de la
subrutine şi întreruperi etc.) în timpul execuţiei programului
16
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrele de segment (CS, DS, SS, ES)
Registrul Extra Segment (ES) – (registrul de date
suplimentare)
Folosit pentru a defini un alt segment, în afara segmentului de
date definit de DS, astfel încât conţinutul de memorie aflat la
distanţă mai mare de 64 Kb poate fi accesată (de exemplu,
scrierea directă în memoria video necesită ca ES să fie setat
pentru a pointa spre segmentul RAM video)
Notă: Datorită unei convenţii stabilite de către INTEL, nu se
poate încărca direct o valoare într-unul din registrele segment,
valoarea trebuie încărcată mai întâi într-unul din registrele de
date (AX, BX, CX sau DX) ţi apoi copiat în registrul segment
De exemplu, pentru a încărca adresa de început a segmentului
de ecran în ES se face:
MOV AX,0B800h ; Adresa de început a memoriei video
MOV ES,AX ; Se culege adresa de segment în ES
17
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Vizualizarea unui program în memorie
18
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Stocarea datelor şi Variabile
Stocarea datelor
În interiorul sistemului de calcul datele pot fi stocate în
următoarele locuri:
În registrele CPU (AX, BX, CX, …)
În octeţii imediat următori codului de operaţie al instrucţiunii (op-
code) (de exemplu, MOV AX,1234)
Segmentul de Cod (CS)
După o instrucţiune PUSH datele sunt stocate în stivă
Segmentul Stack (SS)
În alt segment de date din RAM (folosind instrucţiuni de suprascriere a
segmentului numită şi reacoperire) (de exemplu, memoria RAM video)
Extra Segment (ES)
19
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Stocarea datelor şi Variabile
Variabile de nivel înalt
RAM este organizată ca o înşiruire de octeţi, şi cade în
sarcina utilizatorului să folosească acest spaţiu variabil
Variabilele dintr-un limbaj de nivel înalt trebuie
convertite într-o secvenţă corespunzătoare de octeţi (De
exemplu, FLOAT = 4 octeţi, CHAR = 1 octet etc.)
Revine programatorului din limbaj de asamblare
sarcina să definească ce grupuri de octeţi sau de
cuvinte ar trebui unite să formeze variabile de nivel
înalt
Programatorul trebuie să decidă de asemenea, nişte
locaţii de stocare potrivite pentru date
20
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Variabile de nivel înaltStocarea datelor şi Variabile
O hartă a memoriei care arată numele, adresa variabilelor şi
numărul de biţi alocaţi pentru fiecare poate fi de folos în
alocarea memoriei pentru date
21
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Stocarea datelor şi Variabile
Exemplu de program
Pentru a converti comanda de limbaj înalt C = A + B În limbaj
de asamblare, unde A = 5 şi B = 10:
Dacă la adresa 0200h = A = 5h = 5d,
C va fi stocat la adresa 020Ah
Şi codul se găseşte la 0300h
CS:0300 8A260002 MOV AH,[0200h] ; Valoarea A (DS:0200h)
CS:0304 B70A MOV BH,0Ah ; Valoarea B (CS:0305h)
CS:0306 00FC ADD AH,BH ;A=A+B
CS:0308 88260A02 MOV [020Ah],AH ; C = A (DS:020Ah)
CS:030C CC INT 3 ; Ieşire (Exit)
22
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Stocarea datelor şi Variabile
Exemplu de program
Pentru a încărca locaţia de memorie 0200h cu 5 la început va fi
nevoie:
MOV AH,5
MOV [0200h],AH
În mod similar dacă locaţia de memorie a fost încărcată cu 0Ah =
10d atunci a doua asignare poate fi înlocuită cu:
MOV BH,[0201h]
Notă: Convenţia pentru microprocesoarele INTEL este să se
stocheze cuvintele în RAM într-un format de tipul „litle indian”
(low byte urmat de un hight byte)
De exemplu: MOV [0200h],AH ⇒ 0200h = AL şi 0200h = AH
23
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrul Stack Pointer, Registrul Base Pointer şi
Registrul de Flag-uri (SP, BP, Flags)
- Registrul Stack Pointer (SP)
Pointează spre vârful stivei
SS:SP Întotdeauna pointează spre vârful stivei
24
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
Registrul Stack Pointer, Registrul Base Pointer şi
Registrul de Flag-uri (SP, BP, Flags)
- Registrul de Flag-uri (OF, DF, IF, TF, SF, ZF, AF, PF, CF)
Numai 9 din 16 biţi sunt utilizaţi
OF = Overflow Flag, declanşat dacă rezultatele calculelor
depăşes valorile maxime admise
DF = Direction Flag, folosit în unele instrucţiuni (0 = UP,
dreapta)
IF = Interrupt Enable Flag, folosit ptr. armarea întreruperilor
TF = Trap Flag, folosit pentru depanare (debuging)
SF = Sign Flag, 1 ptr.val. negative (val. în complement faţă de 2)
ZF = Zero Flag, declanşat pentru rezultat = zero
AF = Auxiliary Carry Flag, utilizat în calculul în cod BCD
PF = Parity Flag, declanşat dacă rezultatul are paritate pară
CF = Carry Flag, declanşat dacă calculele generează un
transport
25
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Familia 8086. Registrele modului real
27
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Moduri de adresare 8086 Moduri de adresare
•Modul de adresare registru (General)
oData este copiată dintr-un reg. intr-altul (ex. MOV AX,BX)
28
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Moduri de adresare 8086 Moduri de adresare
Modul de adresare imediat (Constante)
29
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Moduri de adresare 8086 Moduri de adresare
Modul de adresare stivă (Variabile temporale)
Dată temporală mem. în stivă (ex. PUSH AX sau POP DX)
Modul de adresare direct (Variabile)
Dată accesată de la o loc.de memorie (ex. MOV CX,VAR sau
MOV BH,[0200h] sau MOV [0200h],CH sau MOV VAR,AX)
30
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Moduri de adresare
8086 Moduri de adresare
Modul de adresare implicit (copiere de blocuri)
Date mutate în blocuri de la adrese definite de registrele index
SI sau DI
De exemplu:
STOSB/STOSW ⇒ AH/AX → ES:DI în direcţia DF
LODSB/LODSW ⇒ ES:DI → AH/AX în direcţia DF
MOVSB/MOVSW ⇒ DS:SI → ES:DI în direcţia DF
Modul de adresare Bază + Deplasament (Complex Arrays)
Date din locaţii de memorie pointate de BX + o constantă (ex.
MOV CH,[BX+3] sau MOV [BX+6],AH)
Mod de adr. Bază + Deplasament + Index
Date din locaţia de memorie pointată de registrul BX + registrul
index SI + o constantă (ex. MOV CL, [BX+SI+12*3] sau
MOV AH, [BX].VAR[SI])
31
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
32
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
xemple de adresare:
33
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
xemple de adresare:
34
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
xemple de adresare:
35
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
xemple de adresare:
36
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
Moduri de adresare program
• Curgerea secvenţială a unui program poate fi controlată
prin folosirea unor instrucţiuni care asigură ramificarea sau
salturile
• Sunt folosite de asemenea şi alte moduri de adresare
pentru a direcţiona CPU-ul spre diferite locaţii de memorie
care conţin codul programului executabil
Direct
Salt necondiţionat la o locaţie specificată de o constantă
(ex. JMP 0E001h ⇒ sare direct la CS:E001h)
Registru indirect
Salt necondiţionat la o locaţie specificată de adresa conţinută
de un registru (ex. JMP BX ⇒ sare la adresa a cărei offset
este specificat în registrul BX)
37
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
38
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
8086 Moduri de adresare
Moduri de adresare program
Salturi relative (Salturi condiţionale)
Salt condiţionat în concordanţă cu o condiţie, la o locaţie de
memorie aflată la o distanţă între +128 şi –127 octeţi faţă de
locaţia curentă
Exemple:
JE (JZ)- Jump if Equal/Zero Salt dacă-i egal/zero (ZF=1), ex.
după CMP AX,0
JNE (JNZ)- Jump if Not E/Zero Salt dacă nu-i egal/zero (ZF=0)
JB (JNAE)- Jump if Below Salt dacă-i sub (CF=1)
JAE (JNB)- Jump if Not Equal or Above Salt dacă nu-i egal
sau mai mare (CF=0)
JS - Jump if Sign Salt dacă-i negativ (SF=1)
JNS- Jump if Not Sign Salt dacă nu-i negativ (SF=0)
JCXZ - Jump if CX is Zero Salt dacă CX este zero (CX=0)
39
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Subrutine
Apelarea subrutinelor
• În mod normal, un program complet este scris ca un set
de subrutine
• Pentru a executa o subrutină (apelată) este utilizată
instrucţiunea CALL
• O instrucţiune CALL este similară apelării unei
proceduri într-un limbaj de nivel înalt
• Când este executată , forţează salvarea IP-ului şi CS-
ului (pentru apeluri FAR îndepărtate) în stivă, apoi se execută
un salt necondiţionat la adresa apelată
40
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09
Subrutine
Apelarea subrutinelor
• Se pot executa două tipuri de instrucţiuni CALL:
o Un CALL către o adresă de tip NEAR – Numai Offset-ul
trebuie specificat, segmentul rămânând acelaşi
o Un CALL către o adresă de tip FAR – Atât IP cât şi CS
trebuie specificat
• O subrutină apelată cu CALL se termină cu
instrucţiunea RET şi ea reface contextul de revenire în
programul apelant
• Instrucţiunea RET face ca CPU să extragă din stivă
adresa de RETURN (IP sau CS:IP) ţi execută un salt
necondiţionat înapoi la apelant
Ex: CALL 0200 sau CALL 1029:0200
41
Universitatea "1 Decembrie 1918" Alba Iulia 21.11.09