CATEGORII DOCUMENTE |
UNIVERSITATEA TEHNICÃ
CLUJ - NAPOCA
PROCESOARE INTEL X86
Instructiunile SHL, (SAL), SHR si SAR
Aceste instructiuni realizeaza deplasarea (eng. shift) la stanga si respectiv la dreapta a continutului unui operand. La deplasarea 'logica' (SHL, SHR) bitii se copiaza in locatiile invecinate (la stanga sau la dreapta), iar pe locurile ramase libere se inscrie 0 logic. La deplasarea 'aritmetica' (SAL, SAR) se considera ca operandul contine un numar cu semn, iar prin deplasare la stanga si la dreapta se obtine o multiplicare si respectiv o divizare cu puteri ale lui doi (ex: o deplasare la stanga cu 2 pozitii binare este echivalent cu o inmultire cu 4). La deplasarea la dreapta se doreste mentinerea semnului operandului, de aceea bitul mai semnificativ (semnul) se mentine si dupa deplasare. La deplasarea la stanga acest lucru nu este necesar, de aceea instructiunile SHL si SAL reprezinta aceeasi instructiune.
In figura de mai jos s-a reprezentat o deplasare logica si o deplasare aritmetica la dreapta. Se observa ca bitul care iese din operand este inscris in indicatorul de transport CF
Formatul instructiunilor:
SHL <parametru_1>, <parametru_2>
SAL <parametru_1>, <parametru_2>
SHR <parametru_1>, <parametru_2>
SAL <parametru_1>, <parametru_2>
Primul parametru este in concordanta cu definitiile anterioare; al doilea parametru specifica numarul de pozitii binare cu care se face deplasare; acest parametru poate fi 1 sau daca numarul de pasi este mai mare atunci se indica prin registrul CL. La variantele mai noi de procesoare se accepta si forma in care constanta este diferita de 1.
Exemple:
shl ax,1
shr var, cl
Instructiunile de rotire ROR, ROL, RCR, RCL
Aceste instructiuni realizeaza rotirea la dreapta sau la stanga a operandului, cu un numar de pozitii binare. Diferenta fata de instructiunile anterioare de deplasare consta in faptul ca in pozitia eliberata prin deplasare se introduce bitul care iese din operand. Rotirea se poate face cu implicarea indicatorului de transport (CF) in procesul de rotatie (RCR, RCL) sau fara (ROR, ROL). In ambele cazuri bitul care iese din operand se regaseste in indicatorul de transport CF. Figura de mai jos indica cele doua moduri de rotatie pentru o rotatie la dreapta.
Formatul instructiunilor:
ROR <parametru_1>, <parametru_2>
ROL <parametru_1>, <parametru_2>
RCR <parametru_1>, <parametru_2>
RCL <parametru_1>, <parametru_2>
Referitor la parametri, se aplica aceleasi observatii ca si la instructiunile de deplasare.
Instructiunile de salt se utilizeaza pentru controlul secventei de executie a instructiunilor. In principiu exista doua tipuri de salt:
instructiuni de ramificare si ciclare (buclare)
instructiuni de apel si revenire din rutine
Utilizarea rutinelor (a procedurilor) permite structurarea programelor scrise in limbaj de asamblare si implicit scade complexitatea procesului de proiectare si programare. Se recomanda ca anumite operatii care se repeta sa fie scrise sub forma de rutine, urmand a fi apelate de mai multe ori. Uneori se justifica utilizarea de rutine chiar si numai cu scop de structurare a programului.
Instructiunile CALL si RET
Instructiunea CALL realizeaza un salt la adresa exprimata in instructiune. Inainte de salt procesorul salveaza pe stiva adresa de revenire in programul apelant (adresa instructiunii de dupa instructiunea CALL). Instructiunea RET se plaseaza la sfarsitul rutinei si realizeaza revenirea in programul apelant. In acest scop se extrage de pe stiva adresa de revenire si se face salt la aceasta adresa. O rutina contine mai multe instructiuni RET daca exista mai multe ramificari in secventa rutinei.
Formatul instructiunilor:
CALL <adresa>
RET [<constanta>]
unde:
<adresa> - este o eticheta (numele rutinei) sau o expresie evaluabila ca si o adresa
<constanta> indica numarul de pozitii cu care trebuie sa se descarce stiva inainte de revenirea din rutina; in mod uzual acest parametru lipseste
Exemple:
call rut_adunare
call 1000:100
ret ret 2 ; descarcarea stivei cu 2 unitati
Functie de pozitia rutinei fata de instructiunea de apel compilatorul va genera o adresa 'apropiata' (eng. near) care este de fapt adresa de offset a rutinei, sau o adresa 'indepartata' (eng. far), care contine si adresa de segment. Al doilea caz se aplica atunci cand rutina se afla in alt segment decat instructiunea de apel. programatorul poate cere o adresa 'near' sau 'far' in mod explicit printr-o directiva de declarare a procedurii.
Aceste instructiuni modifica secventa de executie a instructiunilor. Exista instructiuni de salt neconditionat (care se executa in orice conditie) si instructiuni de salt conditionat. cele din urma determina executia unui salt in masura in care o anumita conditie este indeplinita. O conditie poate fi starea unui indicator de conditie sau o combinatie a acestora. Formatul instructiunilor este:
JMP <adresa>
J<cc> <adresa>
unde:
<adresa> este o eticheta sau o expresie evaluabila ca si o adresa
<cc> este o combinatie de litere care sugereaza conditia care se aplica
In primul tabel s-au indicat variantele de salt conditionat care implica testarea unui singur indicator de conditie. Urmatoarele doua tabele prezinta instructiunile de salt conditionat utilizate dupa o operatie de comparare a doua numere.
Instructiunea |
Conditia |
Instructiuni echivalente |
Explicatii |
JC |
CF=1 |
JB,JNAE |
salt daca a fost un transport |
JNC |
CF=0 |
JNB,JAE |
salt daca nu a fost un transport |
JZ |
ZF=1 |
JE |
salt daca rezultatul este zero |
JNZ |
ZF=0 |
salt daca rezultatul nu este zero |
|
JS |
SF=1 |
salt daca rezultatul este negativ |
|
JNS |
SF=0 |
salt daca rezultatul este pozitiv |
|
JO |
OF=1 |
salt la depasire de capacitate |
|
JNO |
OF=0 |
salt daca nu este depasire |
|
JP |
PF=1 |
salt daca rezultatul este par |
|
JNP |
PF=0 |
salt daca rezultatul nu este par |
Instructiuni de salt conditionat utilizate dupa compararea a doua numere fara semn:
Instructiune |
Conditie |
Indicatori testati |
Instructiuni echivalente |
Explicatii |
JA |
> |
CF=0,ZF=0 |
JNBE |
salt la mai mare |
JAE |
>= |
CF=0 |
JNB,JNC |
salt la mai mare sau egal |
JB |
< |
CF=1 |
JNAE,JC |
salt la mai mic |
JBE |
<= |
CF=1 sau ZF=1 |
JNA |
salt la mai mic sau egal |
JE |
ZF=1 |
JZ |
salt la egal |
|
JNE |
ZF=0 |
JNZ |
salt la diferit |
Instructiuni de salt utilizate dupa compararea a doua numere cu semn (reprezentate in complement fata de doi).
Instructiune |
Conditie |
Indicatori testati |
Instructiuni echivalente |
Explicatii |
JG |
> |
SF=OF sau ZF=0 |
JNLE |
salt la mai mare |
JGE |
>= |
SF=OF |
JNL |
salt la mai mare sau egal |
JL |
< |
SF!=OF |
JNGE |
salt la mai mic |
JLE |
<= |
SF!=OF sau ZF=1 |
JNG |
salt la mai mic sau egal |
JE |
ZF=1 |
JZ |
salt la egal |
|
JNE |
ZF=0 |
JNZ |
salt la diferit |
Observatie: relatiile de ordine (mai mic, mai mare, etc.) se stabilesc intre primul si al doilea parametru al operatiei de comparare.
Exemple:
cmp ax, 100h
je et1 ; salt daca ax=100h
cmp var1,al
jb mai_mic ; salt daca var1<al
add dx,cx
jo eroare ; salt daca apare depasire de capacitate
Instructiunile de ciclare LOOP, LOOPZ, LOOPNZ
Aceste instructiuni permit implementarea unor structuri de control echivalente cu instructiunile 'for', 'while' 'do-until' din limbajele de nivel inalt. Aceste instructiuni efectueaza o secventa de operatii: decrementarea registrului CX folosit pe post de contor, testarea conditiei de terminare a ciclului si salt la eticheta (la inceputul ciclului) in cazul in care conditia nu este indeplinita.
Sintaxa instructiunilor:
LOOP <adresa>
LOOPZ <adresa>
LOOPNZ <adresa>
unde: <adresa> este o eticheta sau o expresie evaluabila la o adresa
Pentru instructiunea LOOP conditia de terminare a ciclului este CX=0, adica contorul ajunge la 0. Pentru instructiunea LOOPZ in plus ciclul se incheie si in cazul in care ZF=0. La instructiunea LOOPNZ iesirea din bucla se face pentru ZF=1.
Exemplu:
mov cx, 100
et1: ..
loop et1 ; ciclul se executa de 100 de ori
Aceste instructiuni se utilizeaza pentru efectuarea transferurilor cu registrele (porturile) interfetelor de intrare/iesire. Trebuie remarcat faptul ca la procesoarele Intel acestea sunt singurele instructiuni care opereaza cu porturi.
Instructiunile IN si OUT
Instructiunea IN se foloseste pentru citirea unui port de intrare, iar instructiunea OUT pentru scrierea unui port de iesire. Sintaxa instructiunilor este:
IN <acumulator>, <adresa_port>
OUT <adresa_port>, <acumulator>
unde:
<acumulator> - registrul AX pentru transfer pe 16 biti sau AL pentru transfer pe 8 biti
<adresa_port> - o adresa exprimabila pe 8 biti sau registrul DX
Se observa ca daca adresa portului este mai mare decat 255 atunci adresa portului se transmite prin registrul DX.
Exemple:
in al, 20h
mov dx, adresa_port
out dx, ax
Aceste instructiuni s-au introdus cu scopul de a accelera accesul la elementele unei structuri de tip sir sau vector. Instructiunile folosesc in mod implicit registrele index SI si DI pentru adresarea elementelor sirului sursa si respectiv destinatie. In mod implicit registrul DS pastreaza adresa de segment a sursei iar registrul ES adresa de segment a destinatiei. Dupa efectuarea operatiei propriu-zise (specificata prin mnemonica instructiunii), registrele index sunt incrementate sau decrementate automat pentru a trece la elementele urmatoare din sir. Indicatorul DF determina directia de parcurgere a sirurilor: DF=1 prin incrementare, DF=0 prin decrementare. Registrul CX este folosit pentru contorizarea numarului de operatii efectuate. Dupa fiecare executie registrul CX se decrementeaza.
Instructiunile MOVSB, MOVSW
Aceste instructiuni transfera un element din sirul sursa in sirul destinatie. Instructiunea MOVSB opereaza pe octet (eng. move string on byte), iar MOVSW opereaza pe cuvant. La operatiile pe cuvant registrele index se incrementeaza sau se decrementeaza cu 2 unitati, deoarece un cuvant ocupa 2 locatii in memorie. Instructiunile nu au parametrii; programatorul trebuie sa incarce in prealabil adresele sirurilor in registrele SI si DI, si lungimea sirului in CX.
Exemplu:
mov si, offset sir_sursa ; 'offset' este un operator care determina adresa
mov di, offset sir_destinatie ; de offset a variabilei
mov cx, lung_sir
et: MOVSB ; DS:[SI]=>ES:[DI], SI++, DI++, CX--
jnz et
Instructiunile LODSB, LODSW, STOSB si STOSW
Primele doua instructiuni realizeaza incarcarea succesiva a elementelor unui sir in registrul acumulator. Urmatoarele doua instructiuni realizeaza operatia inversa de salvare a registrului acumulator intr-un sir. Si la aceste instructiuni registrele index (SI pentru incarcare si DI pentru salvare) se incrementeaza sau se decrementeaza automat, iar registrul CX se decrementeaza. Terminatiile 'B' respectiv 'W' indica lungimea pe care se face transferul: octet sau cuvant.
Instructiunile CMPSB, CMPSW, SCASB si SCASW
Aceste instructiuni realizeaza operatii de comparare cu elemente ale unui sir. Primele doua instructiuni compara intre ele elementele a doua siruri, iar ultimele doua compara continutul registrului acumulator cu cate un element al sirului (operatie de scanare).
Instructiunile REP, REPZ, REPE, REPNZ, REPNZ
Aceste instructiuni permit executia multipla a unei instructiuni pe siruri. Prin amplasarea unei astfel de instructiuni in fata unei instructiuni pe siruri obliga procesorul executia repetata a operatiei pana ce conditia de terminare este satisfacuta. La prima varianta, REP, conditia de terminare este CX=0. La instructiunile REPZ si REPE operatia se repeta atata timp cat rezultatul este zero sau operanzii sunt egali. La REPNZ si REPNE operatia se repeta atata timp cat rezultatul este diferit de zero sau operanzii sunt diferiti.
Exemple:
mov si, offset sir_sursa
mov di, offset sir_destinatie
mov cx, lungime_sir
rep movsb ; transfera sirul sursa in sirul destinatie
In aceasta categorie s-au inclus acele instructiuni care au efect asupra modului de functionare al procesorului.
Instructiunile CLC, STC, CMC
Aceste instructiuni modifica starea indicatorului CF de transport. Aceste instructiuni au urmatoarele efecte:
CLC sterge (eng. clear) indicatorul, CF=0
STC seteaza indicatorul, CF=1
CMC inverseaza starea indicatorului, CF=NOT CF
Instructiunile CLI si STI
Aceste instructiuni sterg si respectiv seteaza indicatorul de intrerupere IF. In starea setata (IF=1) procesorul detecteaza intreruperile mascabile, iar in starea inversa blocheaza toate intreruperile mascabile.
Instructiunile CLD si STD
Aceste instructiuni modifica starea indicatorului de directie DF. Prin acest indicator se controleaza modul de parcurgere a sirurilor la operatiile pe siruri: prin incrementare (DF=0) sau prin decrementare (DF=1).
Instructiunile NOP, HLT si HIT
Instructiunea NOP nu face nimic (eng. no operation). Aceasta instructiune se foloseste in scopuri de temporizare, pentru intarzierea unor operatii sau pentru implementarea unor bucle de asteptare. Instructiunea HLT (eng. halt) determina oprirea procesorului. Instructiunea HIT determina oprirea temporara a procesorului pana la aparitia unui semnal de intrerupere sau de initializare (reset).
Instructiunea CPUID
Aceasta instructiune permite identificarea tipului de procesor pe care rupeaza programul.
1. Se vor scrie secvente de program cu instructiunile studiate. Se va analiza efectul fiecarei instructiuni si efectul global al programului.
Sa se determine valoarea minima dintr-un sir de valori reprezentate pe cuvant, in complement fata de 2. Ce trebuie sa se schimbe in program daca sirul contine numai numere pozitive (reprezentare fara semn)?
Sa se calculeze valoarea medie a unui sir de valori reprezentate pe octet. Conteaza din punct de vedere al programului daca reprezentarea este in C2 sau este reprezentare fara semn.
Sa se implementeze operatii de inmultire cu anumite constante date, fara sa se foloseasca instructiunile de inmultire. De exemplu inmultirea cu 8, 16, 256, 10, 100.
Sa se scrie o secventa de program care determina numarul de biti de 1 dintr-o valoare reprezentata pe cuvant
Sa se scrie o secventa de program care converteste o valoare hexazecimala reprezentata pe octet, in doua coduri ASCII, corespunzatoare celor doua cifre.
Sa se converteasca un sir de valori hexazecimale intr-un sir de coduri ASCII
Sa se scrie o rutina care efectueaza operatii aritmetice de baza intre doi vectori. Parametrii de intrare:
DS:SI - adresa primului vector
ES:DI - adresa celui de al doilea vector
DS:BX - adresa vectorului rezultat
CX - lungimea vectorilor
AL - codul operatiei (0 - adunare, 1 - scadere, 2 - inmultire, 3 impartire)
O depasire de capacitate va fi indicata prin setarea indicatorului CF (CF=1). Pentru un rezultat corect indicatorul va fi sters (CF=0|)
TABEL CU INTEGRALE, DERIVATE
Tabel integrale Tabel derivate
c' = 0
x' = 1
(xn)' = nxn-1
()' =
dx = (ax)' = axlna
(lnx)' =
dx = e (ex)' = ex
(sinx)' = cosx
(cosx)' = -sinx
(tgx)' =
(ctgx)' =-
( arcsinx)' =
+ C (arccosx)' = -
dx = (arctgx)' =
(arcctgx)' = -
+ C (f.g)' = f'g +fg'
( )' =
(cf)' = cf'
c' = 0
x' = 1
(xn)' = nxn-1
()' =
dx = (ax)' = axlna
(lnx)' =
dx = e (ex)' = ex
(sinx)' = cosx
(cosx)' = -sinx
(tgx)' =
(ctgx)' =-
( arcsinx)' =
+ C (arccosx)' = -
dx = (arctgx)' =
(arcctgx)' = -
+ C (f.g)' = f'g +fg'
( )' =
(cf)' = cf'
Formula Leibnitz - Newton
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1917
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved