Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

PROCESOARE INTEL X86

calculatoare



+ Font mai mare | - Font mai mic



UNIVERSITATEA TEHNICÃ

CLUJ - NAPOCA



PROCESOARE INTEL X86

Setul de instructiuni al familiei de procesoare Intel x86

Instructiuni de deplasare si de rotire

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.

Instructiuni de salt

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

Instructiunile 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.

Instructiunile de ramificare si ciclare

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

Instructiuni de intrare/iesire

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

Instructiuni pe siruri

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

Instructiuni speciale

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.

Mersul lucrarii

1. Se vor scrie secvente de program cu instructiunile studiate. Se va analiza efectul fiecarei instructiuni si efectul global al programului.

Exercitii si probleme

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1884
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved