Sunteți pe pagina 1din 34

3.

2 Arhitectura setului de
instruciuni ISA

Copyright Paul GASNER

Programarea CPU
Programele scrise n limbaje de
nivel nalt trebuie compilate
pentru a obine un program
executabil
Din punctul de vedere al
procesorului, programul este un
set de instruciuni pe care le
execut. Ele trebuie s fie
nelese de ctre acesta
limbajul main, specific
fiecrui procesor n parte

Copyright Paul GASNER

Program nivel nalt

Compilator

Fiier executabil

Unitate Control

Software
Hardware

Cod instruciuni

Core CPU

Limbaje de nivel nalt


Limbajele de nivel nalt prezint cteva faciliti pentru
programare apropiate de modul de gndire uman:
bucle (for, while, loop)
decizii (if-then-else)
funcii, rutine sau proceduri pentru abstractizarea codului
variabile i vectori pentru stocare

Prezint siguran prin includerea mesajelor de eroare


i verificarea sintaxei
Un avantaj major este portabilitatea acelai program
scris ntr-un limbaj nalt poate fi compilat pe mai multe
maini i executat, comportndu-se indentic

Copyright Paul GASNER

Limbaje de nivel cobort


Fiecare CPU are propriul set de instruciuni sau cod
main care reflect nemijlocit designul acestuia
Setul de instruciuni este dificil de neles pentru om:
controlul instruciunilor se limiteaz la jump i branch
suport foarte limitat pentru funcii i proceduri
adresele din memorie trebuie specificate direct (nu lucreaz
cu variabile)

Verificarea erorilor este practic inexistent


Este foarte dificil de a retranscrie programul scris n
cod main pentru un al procesor

Copyright Paul GASNER

Compilarea
Un compilator traduce un program scris ntr-un
limbaj de nivel nalt n cod main pentru a putea fi
executat de CPU
A nu se confunda un compilator cu un interpretor
(vechiul Basic, Perl, Lisp etc)
La procesoarele simple era preferabil scrierea
programelor direct n cod main deoarece se obineau
executabile mai mici i mai rapide dect cele furnizate
de compilatoare
Programele i procesoarele de astzi sunt mult prea
complexe pentru a putea scrie, ntreine i obine
eficiena maxim a codului main
Copyright Paul GASNER

Limbaj de asamblare i limbaj main


Instruciunile n limbaj main sunt o succesiune de bii
(specific fiecrei instruciuni)
n programare se utilizeaz limbajul de asamblare:
se asociaz nume operaiilor i operanzilor
exist o coresponden biunivoc (aproape) ntre aceste nume i
instruciunile cod main (specifice procesorului) i astfel
programele scrise n limbaj de asamblare sunt portabile

Traducerea ntre limbajul de asamblare i limbajul


main, i invers, este realizat de asambloare
Sunt trei categorii principale de instruciuni
operaii de manipulare a datelor (adunare, deplasare)
operaii de transfer de date ntre regitri i RAM
instruciuni de flow control pentru a modifica ordinea de execuie a
instruciunilor program instruciuni de salt
Copyright Paul GASNER

Instruciuni de manipulare date


Corespund operaiilor efectuate de ALU
De exemplu o adunare
operaia
ADD

operanzi
R0,

R1,

Instruciune transfer regitri:


R2

R0 R1 + R2

destinaie sourse

Alte instruciuni:
NOT

R0, R1

R0 R1

ADD

R3, R3, #1

R3 R3 + 1

SUB

R1, R2, #5

R1 R2 - 5

1 i 5 sunt operanzi constani i sunt precedai de hash #


Copyright Paul GASNER

ncrcarea unui registru din RAM

O instruciune load copie


datele dintr-o locaie
RAM ntr-un registru:
LD R1,(R3)

Write

DA

D address
Register File

AA

A address

Constant

BA

B data

MB
S D1 D0
Q

FS

FS

V
C
N
Z

D0
Q D1
S

Copyright Paul GASNER

B address

A data

R1 M[R3]

parantezele arat c este


vorba de o adres stocat
n registrul R3

D data

WR

RAM
+5V
MW

ADRS
DATA
CS
WR

OUT

ALU
F

MD

ncrcarea unui registru n RAM

O instruciune store copie


datele dintr-un registru
ntr-o locaie din RAM:
ST (R3),R1

Write

DA

D address
Register File

AA

A address

B address

A data
Constant

BA

B data

MB

M[R3] R1

S D1 D0
Q

FS

FS

V
C
N
Z

D0
Q D1
S

Copyright Paul GASNER

D data

WR

RAM
+5V
MW

ADRS
DATA
CS
WR

OUT

ALU
F

MD

ncrcarea unui registru cu o constant

LD R1, #0

R1 0

ALU execut o operaie


transfer B (FS=10000),
transferndu-se o valoare
constant n stiva de
regitri
Este o cale foarte simpl
de iniializare a regitrilor

Write

DA

D address
Register File

AA

A address

B address

A data
Constant

BA

B data

MB
S D1 D0
Q

FS

FS

V
C
N
Z

D0
Q D1
S

Copyright Paul GASNER

D data

WR

RAM
+5V
MW

ADRS
DATA
CS
WR

OUT

ALU
F

MD

10

Stocarea unei constante n RAM

ST (R3),#0

M[R3] 0

Este o cale simpl de a


iniializa coninutul RAM

D data

WR

Write

DA

D address
Register File

AA

A address

B address

A data
Constant

BA

B data

MB
S D1 D0
Q

FS

FS

V
C
N
Z

D0
Q D1
S

Copyright Paul GASNER

RAM
+5V
MW

ADRS
DATA
CS
WR

OUT

ALU
F

MD

11

Importana notaiilor
Simbolurile # i () specific moduri diferite de adresare
Modul de adresare determin datele utilizate de
operanzi:
LD
LD

R0, #1000
R0, 1000

// R0 1000
// R0 M[1000]

LD
LD

R3, R0
R3, (R0)

// R3 R0
// R3 M[R0]

Designul core determin exact ce mod de adresare se


utilizeaz

Copyright Paul GASNER

12

Exemplu
O simpl operaie de transfer de regitri:
M[1000] M[1000] + 1

n limbaj de asamblare are echivalentul:


LD
LD
ADD
ST

R0, #1000
R3, (R0)
R3, R3, #1
(R0), R3

//
//
//
//

R0 1000
R3 M[1000]
R3 R3 + 1
M[1000] R3

Sunt necesare foarte multe operaii n asamblare

Copyright Paul GASNER

13

Instruciuni flow control


Programele sunt constituite dintr-o mulime de
instruciuni secveniale, executate consecutiv
Programele sunt stocate n memorie:
fiecare instruciune program ocup o singur locaie de
memorie
instruciunile sunt stocate una dup alta
768:
769:
770:
771:

LD
LD
ADD
ST

R0, #1000
R3, (R0)
R3, R3, #1
(R0), R3

//
//
//
//

R0 1000
R3 M[1000]
R3 R3 + 1
M[1000] R3

Program counter (PC) pstreaz adresa instruciunii curente


n mod normal, PC se incrementeaz dup execuia fiecrei
instruciuni
n mod excepional acest comportament se schimb prin
instruciunile flow control
Copyright Paul GASNER

14

Jump
O instruciune jump modific valoarea PC
operandul specific exact cum se schimb PC
pentru simplitate vom utiliza etichete n locul adreselor
LD
LD
JMP
K LD
LD
L ADD
ST

R1, #10
R2, #3
L
R1, #20 // Aceste dou instruciuni
R2, #4
//
nu sunt executate acum
R3, R3, R2
(R1), R3

Jump poate fi utilizat pentru repetarea unor


instruciuni:
LD R1, #0
F ADD R1, R1, #1
JMP F
// o bucl infinit
Copyright Paul GASNER

15

Branch
O instruciune branch modific valoarea PC n funcie
de starea de adevr a unei condiii
LD
LD
BZ
K LD
LD

#10
#3
L
// Jump to L dac R4==0
#20 // Aceste dou instruciuni
#4
// sunt executate sau nu
// n funie de R4
L ADD R3, R3, R2
ST (R1), R3

Copyright Paul GASNER

R1,
R2,
R4,
R1,
R2,

16

Branch
Condiiile pentru branch sunt de obicei rezultate ALU
Aici intervin biii de stare ai ALU: V, C, N i Z. Cu
ajutorul acestora se pot implementa o serie de
instruciuni branch
Branch
Branch
Branch
Branch
Branch
Branch
Branch
Branch

Condiie
on overflow
on no overflow
if carry set
if carry clear
if negative
if positive
if zero
if non-zero

Prescurtare
BV
BNV
BC
BNC
BN
BNN
BZ
BNZ

ALU status bits


V=1
V=0
C=1
C=0
N=1
N=0
Z=1
Z=0

Alte condiii branch (de exemplu condiii de mai mare,


egal sau mai mic) sunt derivate din acestea
Copyright Paul GASNER

17

if-then
Un set de instruciuni n C se traduce n asamblor n
felul urmtor
R1 = *X;
if (R1 < 0)
R1 = -R1;
R3 = R1 + R1;

LD
BNN
MUL
ADD

R1,
R1,
R1,
R3,

(X)
//
L
//
R1, #-1 //
R1, R1 //

R1 =
Skip
R1 =
R3 =

*X
MUL if R1 este pozitiv
-R1
R1 + R1

Uneori este mai simplu i mai rapid s se inverseze


condiiile: R1<0 nlocuit cu R1>=0
Copyright Paul GASNER

18

loop
... sau pentru o bucl, utiliznd o funcie ipotetic BGT
R1 = 0;
for (R2 = 1; R2 <= 5; R2++)
R1 = R1 + R2;
R3 = R1 + R1;

LD
LD
FOR BGT
ADD
ADD
JMP
L
ADD

Copyright Paul GASNER

R1,
R2,
R2,
R1,
R2,
FOR
R3,

#0
#1
#5, L
R1, R2
R2, #1

//
//
//
//
//
//
R1, R1 //

R1 = 0
R2 = 1
Stop when R2 > 5
R1 = R1 + R2
R2++
Go back to the loop test
R3 = R1 + R1

19

CPU
Program

Control
Unit

Semnale Control
Semnale Status

Core

Unitatea de control conecteaz programul la ALU


convertete instruciunile program n cuvinte comenzi pentru
core, prin semnalele WR, DA, AA, BA, MB, FS, MW, MD
execut instruciunile program n ordinea corespunztoare
genereaz intrarea constant pentru ALU

Core trimite informaii unitii de control, de obicei pe


biii status V, C, N i Z, care sunt verificai prin
instruciunile branch de exemplu
Copyright Paul GASNER

20

Limbaj main
Limbajul main este expresia binar a instruciunilor
limbajului de asamblare, specifice CPU
Sunt 3 tipuri de instruciuni, deci 3 reprezentri binare:
instruciuni format registru doi operazi din regitri
instruciuni format constant un operand din regitri i
cellalt este constant
instruciuni format jump i branch o surs registru i o
adres din constant

E preferabil o reprezentare ct mai asemntoare


pentru toate tipurile de formate (chiar dac sunt
diferite):
implementarea hard a unitii de control este mai simpl
vom ncerca implementarea instruciunilor pe 16 bii
Copyright Paul GASNER

21

Format registru
15

9 8

Cod operaie (Opcod)

6 5

Registru
Destinaie
(DR)

3 2

Surs
Registru A
(SA)

Surs
Registru B
(SB)

De exemplu
ADD R1, R2, R3

O instruciune format registru cuprinde:


cmpul opcod pe 7 bii care specific operaia
cmpul pe 3 bii registru destinaie DR
dou cmpuri pe 3 bii SA i SB pentru selectarea regitrilor
surs A i B

Copyright Paul GASNER

22

Format constant
15

9 8

Cod operaie (Opcod)

6 5

Registru
Destinaie
(DR)

3 2

Surs
Registru A
(SA)

Operand
(OP)

De exemplu
ADD R1, R2, #3

O instruciune format constant cuprinde:


7 bii codoperaie
3 bii registru destinaie DR
3 bii surs registru A SA
3 bii operand constant OP

Copyright Paul GASNER

23

Format jump i branch


15

9 8

Cod operaie (Opcod)

6 5

Adresa
bit 5-3
(AD)

3 2

Surs
Registru A
(SA)

Adresa
bit 0-2
(AD)

De exemplu
BZ R3, -24
JMP 18

O instruciune format registru cuprinde:


7 bii codoperaie
3 bii surs registru A SA (aceeai poziie n toate formatele)
6 bii cmp adres AD pentru stocarea adresei specificate de
jump sau branch numr cu semn pe 6 bii, deci se poate
sri peste 25-1=31 adrese napoi sau 25=32 nainte
Copyright Paul GASNER

24

Formatul instruciunilor
15

9 8

Registru
Destinaie
(DR)

Cod operaie (Opcod)


15

6 5

9 8

15

6 5

9 8

Cod operaie (Opcod)

Surs
Registru A
(SA)

Registru
Destinaie
(DR)

Cod operaie (Opcod)

3 2

Surs
Registru B
(SB)
3 2

Surs
Registru A
(SA)
6 5

Adresa
bit 5-3
(AD)

Operand
(OP)
3 2

Surs
Registru A
(SA)

Adresa
bit 0-2
(AD)

DR, SA i SB sunt cmpuri 3 bits, deci se pot accesa


maximum 8 regitri
Suport pentru mai muli regitri sau numere mai mari
implic mrirea lungimii n bii a instruciunilor main
Copyright Paul GASNER

25

Organizarea instruciunilor
Criterii:
instruciuni similare au cmpuri opcod similare
dup semnalele de control, instruciunile se pot grupa n 8
categorii distincte
Tip instruciuni
Operaie Format Registru ALU
Operaie Deplasare Format Registru
Scriere Memorie (din regitri)
Citire Memorie (n regitri)
Operaie ALU cu constant
Operaie deplasare constant
Branch Condiional
Jump

Copyright Paul GASNER

26

Operaii ALU format registru


ADD R1, R2, R3

Toate operaiile format


registru trebuie s aib
semnalele de control:
MB = 0, toi operanzii
provin din setul de
regitri
MD = 0 i WR = 1,
pentru a salva rezultatul
ALU napoi n regitri
MW = 0 deoarece RAM
nu se modific

D
DA

Register file

AA

constant
1

Mux B

FS
V
C
N
Z

MB
0

ADRS
MW
0

ALU
G

Mux D

Copyright Paul GASNER

BA

DATA

Data RAM
OUT

MD
0

27

Operaii ALU format registru


ST (R0), R1

Toate operaiile format


registru trebuie s aib
semnalele de control:
MB = 0, toi operanzii
provin din setul de
regitri
MD = X i WR = 0,
deoarece nici un registru
nu se modific
MW = 1 pentru a scrie n
RAM

D
DA

Register file

AA

constant
1

Mux B

FS
V
C
N
Z

MB
0

ADRS
MW
1

ALU
G

Mux D

Copyright Paul GASNER

BA

DATA

Data RAM
OUT

MD
X

28

Selecie cod operaie


Instruciunile din aceeai categorie au primii trei bii
din cmpul opcod (biii 15-13 ai instruciunii)
Opcod
Tip instruciuni

bit
15

bit
14

bit
13

Operaie Format Registru ALU


Operaie Deplasare Format Registru
Scriere Memorie (din regitri)
Citire Memorie (n regitri)
Operaie ALU cu constant
Operaie deplasare constant
Branch Condiional
Jump

0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

Copyright Paul GASNER

29

Instruciuni ALU i de deplasare


Biii 12-9 din opcod sunt ocupai
cu cei 4 bii ai funciei de selecie
FS din ALU
De exemplu, o instruciune XOR
(pentru regitri) va avea codul
0001100
primii 3 bii indic o instruciune
format regitri pentru ALU
ultimii 4 bii indic operaia XOR

1011000 indic:
101 instruciune format constant
1000 deplasare spre stnga cu un
bit
Copyright Paul GASNER

FS
00000
00001
00010
00011
00100
00101
00110
00111
01000
01010
01100
01110
10000
10100
11000

Operaie
F=A
F=A+1
F=A+B
F=A+B+1
F = A + B
F = A + B + 1
F=A1
F=A

F = A B (AND)

F = A B (OR)
F=AB
F = A
F=B
F = sr B (shift right)
F = sl B (shift left)

30

Instruciuni branch
Avem 8 condiii diferite, deci sunt
necesari 3 bits
Biii 11-9 din opcod sunt ocupai cu
cei 3 bii care indic tipul de branch
De exemplu, instruciuna branch if
zero va avea codul 110x011
primii 3 bii pentru instruciunea tip
branch
ultimii 3 bii pentru if zero

Copyright Paul GASNER

Condiie
If carry set
If negative
If overflow
If zero
If carry clear
If positive
If no overflow
If non-zero

BC
000
001
010
011
100
101
110
111

31

Exemple cod operaie


Cteva exemple de instruciuni i cmpul opcod
corespunztor n codul binar al instruciunii:
Instruciune

Opcod bits (15-13)

Opcod bits (12-9)

LD

R1, (R0)

011 (load)

xxxx (unused)

BZ

R1, +4

110 (branch)

x011

SUB R5, R5, #1

100 (immediate arithmetic)

0100 (subtract)

ADD R1, R0, R5

000 (register arithmetic)

0010 (add)

JMP 3

111 (jump)

xxxx (unused)

(branch on zero)

Unele coduri au bii neutilizai:


8 instruciuni branch, deci 3 bii utilizai
un singur tip de jump

Codurile neutilizate pot fi folosite la extinderea


ulterioar a setului de instruciuni
Copyright Paul GASNER

32

Exemple instruciuni
Cteva exemple de instruciuni complete:
Instruciune
LD R1, (R0)
BZ R1, +4
SUB R5, R5, #1
ADD R1, R0, R5
JMP 3

Copyright Paul GASNER

Bits 15-9
(Opcode) Bits 8-6 Bits 5-3 Bits 2-0
Format
011xxxx
001
000
xxx Constant
110x011
000
001
100 Jump/branch
1000100
101
101
001 Constant
0000010
001
000
101 Registru
111xxxx
111
xxx
101 Jump/branch

33

ISA. Concluzii
Un program trebuie tradus n cod main pentru a putea
fi executat
Exist o coresponden biunivoc ntre limbajul de
asamblare i limbajul main (binar)
Exist trei tipuri de instruciuni:
manipularea datelor (operaii ALU)
operaii cu regitri i cu RAM
instruciuni de salt control flow

Alegerea codurilor binare pentru instruciuni se face


astfel nct la instruciuni similare s corespund coduri
similare

Copyright Paul GASNER

34

S-ar putea să vă placă și