cursul 2 registrele cpu 8086 si moduri de adresare

41
12.06.22 Universitatea "1 Decembrie 1918" Alb a Iulia 1 Registrele CPU şi Registrele CPU şi modurile de modurile de adresare ale adresare ale memoriei memoriei (Cursul 2) (Cursul 2)

Upload: api-19439172

Post on 13-Jun-2015

215 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia1

Registrele CPU şi Registrele CPU şi modurile de adresare modurile de adresare

ale memoriei ale memoriei (Cursul 2)(Cursul 2)

Page 2: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia2

IntroducereIntroducere Subiectele prelegerii:

În cursul anterior s-a făcut o scurtă prezentare a componentelor unui sistem compatibil IBM PC

În prelegerea de faţă ne vom concentra asupra celor mai importante două componente (CPU şi memoria internă) care compun sistemele compatibile IBM PC:

CPU-ul (microprocesorul) şi registrele sale Memoria internă, organizarea ei şi diferitele moduri de

adresare care sunt folosite de CPU pentru accesarea locaţiilor de memorie

Page 3: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia3

Registrele CPU 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

Page 4: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia4

Registrele CPU 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

 

Page 5: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia5

Registrele CPU 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

Page 6: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia6

Componente CPU 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.

Page 7: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia7

Organizarea memoriei 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)

 

Page 8: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia8

Organizarea memoriei Organizarea memoriei

Page 9: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia9

Familia 8086. Registrele modului real Familia 8086. Registrele modului real

Page 10: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia10

Familia 8086. Registrele modului real 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

Page 11: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia11

Familia 8086. Registrele modului real 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

Page 12: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia12

Familia 8086. Registrele modului real Familia 8086. Registrele modului real

Registrele de date (AX, BX, CX, DX)Registrul destinaţie DX (DH/DL) Utilizat la instrucţiuni I/O (IN, OUT) pentru a reţine

adresa portului accesat Folosit la instrucţiunea de înmulţire (MUL) sau la

împărţire ( DIV) pentru a reţine rezultatul după executarea acestora folosind date pe 32 de biţi

De asemenea este utilizat de BIOS pentru a seta poziţia cursorului

Page 13: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia13

Familia 8086. Registrele modului real 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)

Page 14: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia14

Familia 8086. Registrele modului real 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

Page 15: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia15

Familia 8086. Registrele modului real 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

Page 16: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia16

Familia 8086. Registrele modului real 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

 

Page 17: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia17

Familia 8086. Registrele modului real 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

Page 18: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia18

Vizualizarea unui program în memorie Vizualizarea unui program în memorie

Page 19: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia19

Stocarea datelor şi Variabile 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)

Page 20: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia20

Stocarea datelor şi Variabile 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  

Page 21: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia21

Stocarea datelor şi Variabile Stocarea datelor şi Variabile Variabile de nivel înalt 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

Page 22: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia22

Stocarea datelor şi Variabile 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 0300hCS: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 + BCS:0308 88260A02 MOV [020Ah],AH ; C = A (DS:020Ah)CS:030C CC INT 3 ; Ieşire (Exit)

Page 23: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia23

Stocarea datelor şi Variabile 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

Page 24: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia24

Familia 8086. Registrele modului real 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

- Registrul Base Pointer (BP) Folosit ca pointer al zonelor de memorie Lucrează în segmentul de date DS Rar folosit 

Page 25: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia25

Familia 8086. Registrele modului real 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

Page 26: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia26

Familia 8086. Registrele modului real Familia 8086. Registrele modului real

Registrele index (SI, DI)Registrul index sursă (SI - Source Index) Folosit pentru a pointa spre un octet sau un cuvânt, în segmentul

de date curent, care trebuie luat ca o parte a unui blocCPU-ul întotdeauna foloseşte acest registru împreună cu

segmentul, i.e. DS:SI = adresă fizicăUtilizat în instrucţiuni pe şiruri de caractere (LODS şi MOVS)

ca adresă sursă (DS:SI) pentru date Afectat de DF când este utilizat în instrucţiuni pe şiruri

(instrucţiunile pe şiruri de caractere ajustează automat valoarea lui SI pentru a pointa la următorul octet/caracter)

De exemplu: MOV SI,0200h face ca SI să pointeze al 0200h-elea octet din Data Segment

Page 27: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia27

Familia 8086. Registrele modului real Familia 8086. Registrele modului real Registrele index (SI, DI)o       Registrul index destinaţie (DI - Destination Index) Similar cu registrul SI dar care lucrează împreună registrul

extra segment (ES) Folosit pentru a pointa spre un octet sau un cuvânt, în extra

segment, care are nevoie a fi schimbat ca o parte de început a blocului de date transferat, i.e. ES:DI = adresă fizică

Utilizat în instrucţiuni pe şiruri de caractere (STOS şi MOVS) ca adresă destinaţie (ES:DI) pentru date

 Instrucţiunile pe şir de caractere MOVSB/W utilizează ambele registre SI şi DI pentru transfer de octeţi sau cuvinte de la DS:SI ES:DI

De asemenea este afectat Flag-ul de direcţie DF

Page 28: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia28

8086 Moduri de adresare 8086 Moduri de adresare

Moduri de adresare•Modul de adresare registru (General)

oData este copiată dintr-un reg. intr-altul (ex. MOV AX,BX)

Page 29: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia29

8086 Moduri de adresare 8086 Moduri de adresare Moduri de adresare Modul de adresare imediat (Constante)Valoarea din instr.este mutată într-un registru (ex. MOV AL,1Fh)

Page 30: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia30

8086 Moduri de adresare 8086 Moduri de adresare 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)

Page 31: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia31

8086 Moduri de adresare 8086 Moduri de adresare 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 DFLODSB/LODSW ES:DI AH/AX în direcţia DFMOVSB/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])

Page 32: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia32

8086 Moduri de adresare 8086 Moduri de adresare

Page 33: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia33

8086 Moduri de adresare 8086 Moduri de adresare Exemple de adresare: Adresare registru - registru MOV DX,CX

Page 34: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia34

8086 Moduri de adresare 8086 Moduri de adresare Exemple de adresare:Adresare indirectă registru MOV AH,[SI]

Page 35: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia35

8086 Moduri de adresare 8086 Moduri de adresare Exemple de adresare:Adresare directă indexată: MOV AH,VAR[SI]

Page 36: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia36

8086 Moduri de adresare 8086 Moduri de adresare Exemple de adresare:Adresare directă bazată MOV [BX].VAR,AL

Page 37: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia37

Moduri de adresare programModuri de adresare program                  Curgerea secvenţială a unui program poate fi controlată Curgerea secvenţială a unui program poate fi controlată prin folosirea unor instrucţiuni care asigură ramificarea sau prin folosirea unor instrucţiuni care asigură ramificarea sau salturilesalturile                  Sunt folosite de asemenea şi alte moduri de adresare Sunt folosite de asemenea şi alte moduri de adresare pentru a direcţiona CPU-ul spre diferite locaţii de memorie pentru a direcţiona CPU-ul spre diferite locaţii de memorie care conţin codul programului executabilcare conţin codul programului executabil

DirectDirectSalt necondiţionat la o locaţie specificată de o constantăSalt necondiţionat la o locaţie specificată de o constantă(ex. JMP 0E001h (ex. JMP 0E001h sare direct la CS:E001h) sare direct la CS:E001h)

Registru indirectRegistru indirectSalt necondiţionat la o locaţie specificată de adresa conţinută Salt necondiţionat la o locaţie specificată de adresa conţinută de un registrude un registru (ex. JMP BX (ex. JMP BX sare la adresa a cărei offset sare la adresa a cărei offset este specificat în registrul BX)este specificat în registrul BX)

8086 Moduri de adresare 8086 Moduri de adresare

Page 38: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia38

Moduri de adresare programModuri de adresare programMemorie indirectăMemorie indirectăSalt necondiţionat la o locaţie care este dată de două Salt necondiţionat la o locaţie care este dată de două locaţii de memorie piontate de un registru locaţii de memorie piontate de un registru (ex. JMP (ex. JMP [DI][DI] Înlocuieşte IP cu conţinutul locaţiei Înlocuieşte IP cu conţinutul locaţiei de memorie pointată de DI şi DI+1)de memorie pointată de DI şi DI+1)DeparteDeparteSalt necondiţionat la o locaţie de memorie care se Salt necondiţionat la o locaţie de memorie care se află în afara actualului segment de cod, însemnând află în afara actualului segment de cod, însemnând că nu numai IP ci şi CS sunt înlocuite cu valori noi că nu numai IP ci şi CS sunt înlocuite cu valori noi

8086 Moduri de adresare 8086 Moduri de adresare

Page 39: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia39

Moduri de adresare programModuri de adresare programSalturi relative (Salturi condiţionale)Salturi relative (Salturi condiţionale)Salt condiţionat în concordanţă cu o condiţie, la o locaţie de 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 memorie aflată la o distanţă între +128 şi –127 octeţi faţă de locaţia curentălocaţia curentăExExempleemple::JE (JZ)- Jump if Equal/Zero Salt dacă-i egal/zero (ZF=1), ex. JE (JZ)- Jump if Equal/Zero Salt dacă-i egal/zero (ZF=1), ex. după CMP AX,0după CMP AX,0JNE (JNZ)- Jump if Not E/Zero Salt dacă nu-i egal/zero (ZF=JNE (JNZ)- Jump if Not E/Zero Salt dacă nu-i egal/zero (ZF=00))JB (JNAE)- Jump if Below Salt dacă-i sub (CF=1)JB (JNAE)- Jump if Below Salt dacă-i sub (CF=1)JAE (JNB)- Jump if Not Equal or Above Salt dacă nu-i egal JAE (JNB)- Jump if Not Equal or Above Salt dacă nu-i egal sau mai mare (CF=0)sau mai mare (CF=0)JS - Jump if Sign Salt dacă-i negativ (SF=1)JS - Jump if Sign Salt dacă-i negativ (SF=1)JNS- Jump if Not Sign Salt dacă nu-i negativ (SF=0)JNS- Jump if Not Sign Salt dacă nu-i negativ (SF=0)JCXZJCXZ - Jump if CX is Zero Salt dacă CX este zero (CX=0) - Jump if CX is Zero Salt dacă CX este zero (CX=0)

8086 Moduri de adresare 8086 Moduri de adresare

Page 40: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia40

Apelarea subrutinelorApelarea subrutinelor                  În mod normal, un program complet este scris ca un set În mod normal, un program complet este scris ca un set de subrutinede subrutine                  Pentru a executa o subrutină (apelată) este utilizată Pentru a executa o subrutină (apelată) este utilizată instrucţiunea CALLinstrucţiunea CALL                  O instrucţiune CALL este similară apelării unei O instrucţiune CALL este similară apelării unei proceduri într-un limbaj de nivel înaltproceduri într-un limbaj de nivel înalt                  Când este executată , forţează salvarea IP-ului şi CS-Când este executată , forţează salvarea IP-ului şi CS-ului (pentru apeluri FAR îndepărtate) în stivă, apoi se execută ului (pentru apeluri FAR îndepărtate) în stivă, apoi se execută un salt necondiţionat la adresa apelată un salt necondiţionat la adresa apelată   

Subrutine Subrutine

Page 41: Cursul 2 Registrele CPU 8086 si Moduri de adresare

12.04.23Universitatea "1 Decembrie 1918" Alba Iulia41

Apelarea subrutinelorApelarea subrutinelor                  Se pot executa două tipuri de instrucţiuni CALL:Se pot executa două tipuri de instrucţiuni CALL:oo                Un CALL către o adresă de tip NEAR – Numai Offset-ul Un CALL către o adresă de tip NEAR – Numai Offset-ul trebuie specificat, segmentul rămânând acelaşi trebuie specificat, segmentul rămânând acelaşi oo                Un CALL către o adresă de tip FAR – Atât IP cât şi CS Un CALL către o adresă de tip FAR – Atât IP cât şi CS trebuie specificattrebuie specificat                  O subrutină apelată cu CALL se termină cu O subrutină apelată cu CALL se termină cu instrucţiunea RET şi ea reface contextul de revenire în instrucţiunea RET şi ea reface contextul de revenire în programul apelantprogramul apelant                  Instrucţiunea RET face ca CPU să extragă din stivă Instrucţiunea RET face ca CPU să extragă din stivă adresa de RETURN (IP sau CS:IP) ţi execută un salt adresa de RETURN (IP sau CS:IP) ţi execută un salt necondiţionat înapoi la apelantnecondiţionat înapoi la apelantEx: CALL 0200 sau CALL 1029:0200 Ex: CALL 0200 sau CALL 1029:0200   

Subrutine Subrutine