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)
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
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
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
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
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.
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)
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia8
Organizarea memoriei Organizarea memoriei
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia9
Familia 8086. Registrele modului real Familia 8086. Registrele modului real
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
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
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
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)
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
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
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
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
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia18
Vizualizarea unui program în memorie Vizualizarea unui program în memorie
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)
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
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
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)
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
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
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
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
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
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)
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)
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)
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])
12.04.23Universitatea "1 Decembrie 1918" Alba Iulia32
8086 Moduri de adresare 8086 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
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]
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]
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
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
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
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
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
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