Copyright Paul GASNERCopyright Paul GASNER
3.2 Arhitectura setului de 3.2 Arhitectura setului de instrucţiuni – ISAinstrucţiuni – ISA
Copyright Paul GASNERCopyright Paul GASNER 2
Programarea CPUProgramarea CPUProgramele scrise în limbaje de nivel înalt trebuie compilate pentru a obţine un program executabilDin punctul de vedere al procesorului, programul este un set de instrucţiuni pe care le execută. Ele trebuie să fie înţelese de către acesta – limbajul maşină, specific fiecărui procesor în parte
Core CPU
Program nivel înalt
Fişier executabil
Cod instrucţiuni
Compilator
Unitate ControlHardware
Software
Copyright Paul GASNERCopyright Paul GASNER 3
Limbaje de nivel înaltLimbaje de nivel înaltLimbajele de nivel înalt prezintă câteva facilităţi pentru programare apropiate de modul de gândire uman:
bucle (for, while, loop)decizii (if-then-else)funcţii, rutine sau proceduri pentru abstractizarea coduluivariabile şi vectori pentru stocare
Prezintă siguranţă prin includerea mesajelor de eroare şi verificarea sintaxeiUn avantaj major este portabilitatea – acelaşi program scris într-un limbaj înalt poate fi compilat pe mai multe maşini şi executat, comportându-se indentic
Copyright Paul GASNERCopyright Paul GASNER 4
Limbaje de nivel coborâtLimbaje de nivel coborâtFiecare CPU are propriul set de instrucţiuni – sau cod maşină – care reflectă nemijlocit designul acestuiaSetul de instrucţiuni este dificil de înţeles pentru om:
controlul instrucţiunilor se limitează la „jump” şi „branch”suport foarte limitat pentru funcţii şi proceduriadresele din memorie trebuie specificate direct (nu lucrează cu variabile)
Verificarea erorilor este practic inexistentăEste foarte dificil de a retranscrie programul scris în cod maşină pentru un al procesor
Copyright Paul GASNERCopyright Paul GASNER 5
CompilareaCompilareaUn compilator „traduce” un program scris într-un limbaj de nivel înalt în cod maşină pentru a putea fi executat de CPUA nu se confunda un compilator cu un interpretor (vechiul Basic, Perl, Lisp etc)La procesoarele simple era preferabilă scrierea programelor direct în cod maşină deoarece se obţineau executabile mai mici şi mai rapide decât cele furnizate de compilatoareProgramele şi procesoarele de astăzi sunt mult prea complexe pentru a putea scrie, întreţine şi obţine eficienţa maximă a codului maşină
Copyright Paul GASNERCopyright Paul GASNER 6
Limbaj de asamblare şi limbaj maşinăLimbaj de asamblare şi limbaj maşinăInstrucţiunile în limbaj maşină sunt o succesiune de biţi (specifică fiecărei instrucţiuni)În programare se utilizează limbajul de asamblare:
se asociază „nume” operaţiilor şi operanzilorexistă o corespondenţă biunivocă (aproape) între aceste nume şi instrucţiunile cod maşină (specifice procesorului) şi astfel programele scrise în limbaj de asamblare sunt portabile
Traducerea între limbajul de asamblare şi limbajul maşină, şi invers, este realizată de asambloareSunt trei categorii principale de instrucţiuni
operaţii de manipulare a datelor (adunare, deplasare)operaţii de transfer de date între regiştri şi RAMinstrucţiuni de flow control pentru a modifica ordinea de execuţie a instrucţiunilor program – instrucţiuni de salt
Copyright Paul GASNERCopyright Paul GASNER 7
Instrucţiuni de manipulare dateInstrucţiuni de manipulare dateCorespund operaţiilor efectuate de ALUDe exemplu o adunare
ADD R0, R1, R2operaţia
destinaţie sourse
operanzi
R0 ← R1 + R2Instrucţiune transfer regiştri:
Alte instrucţiuni:NOT R0, R1 R0 ← R1’ADD R3, R3, #1 R3 ← R3 + 1SUB R1, R2, #5 R1 ← R2 - 5
1 şi 5 sunt operanzi constanţi şi sunt precedaţi de hash #
Copyright Paul GASNERCopyright Paul GASNER 8
Încărcarea unui registru din RAMÎncărcarea unui registru din RAM
O instrucţiune load copie datele dintr-o locaţie RAM într-un registru:
LD R1,(R3) R1 ← M[R3]parantezele arată că este vorba de o adresă stocată în registrul R3
D data Write D address
A address B address
A data B data
Register File
WRDA
AA BA
RAM ADRS DATA CS WR
OUT
MW+5V
A B
ALU
FZNCVFSFS
MD
S D1 D0 Q
Constant MB
Q D1 D0
S
Copyright Paul GASNERCopyright Paul GASNER 9
Încărcarea unui registru în RAMÎncărcarea unui registru în RAM
O instrucţiune store copie datele dintr-un registru într-o locaţie din RAM:
ST (R3),R1 M[R3] ← R1
Q D1 D0
S
A B
ALU
FZNCVFSFS
MD
S D1 D0 Q
Constant MB
RAM ADRS DATA CS WR
OUT
MW+5V
D data Write D address
A address B address
A data B data
Register File
WRDA
AA BA
Copyright Paul GASNERCopyright Paul GASNER 10
Încărcarea unui registru cu o constantăÎncărcarea unui registru cu o constantă
LD R1, #0 R1 ← 0ALU execută o operaţie „transfer B” (FS=10000), transferându-se o valoare constantă în stiva de regiştriEste o cale foarte simplă de iniţializare a regiştrilor
D data Write D address
A address B address
A data B data
Register File
WRDA
AA BA
Q D1 D0
S
RAM ADRS DATA CS WR
OUT
MW+5V
MD
S D1 D0 Q
Constant MB
A B
ALU
FZNCVFSFS
Copyright Paul GASNERCopyright Paul GASNER 11
Stocarea unei constante în RAMStocarea unei constante în RAM
ST (R3),#0 M[R3] ← 0Este o cale simplă de a iniţializa conţinutul RAM
D data Write D address
A address B address
A data B data
Register File
WRDA
AA BA
Q D1 D0
S
A B
ALU
FZNCVFSFS
MD
S D1 D0 Q
Constant MB
RAM ADRS DATA CS WR
OUT
MW+5V
Copyright Paul GASNERCopyright Paul GASNER 12
Importanţa notaţiilorImportanţa notaţiilorSimbolurile # şi () specifică moduri diferite de adresareModul de adresare determină datele utilizate de operanzi:
LD R0, #1000 // R0 ← 1000LD R0, 1000 // R0 ← M[1000]
LD R3, R0 // R3 ← R0LD R3, (R0) // R3 ← M[R0]
Designul core determină exact ce mod de adresare se utilizează
Copyright Paul GASNERCopyright Paul GASNER 13
ExempluExempluO simplă operaţie de transfer de regiştri:
M[1000] ← M[1000] + 1În limbaj de asamblare are echivalentul:
LD R0, #1000 // R0 ← 1000LD R3, (R0) // R3 ← M[1000]ADD R3, R3, #1 // R3 ← R3 + 1ST (R0), R3 // M[1000] ← R3
Sunt necesare foarte multe operaţii în asamblare
Copyright Paul GASNERCopyright Paul GASNER 14
Instrucţiuni flow controlInstrucţiuni flow controlProgramele sunt constituite dintr-o mulţime de instrucţiuni secvenţiale, executate consecutivProgramele sunt stocate în memorie:
fiecare instrucţiune program ocupă o singură locaţie de memorieinstrucţiunile sunt stocate una după alta
768: LD R0, #1000 // R0 ← 1000769: LD R3, (R0) // R3 ← M[1000]770: ADD R3, R3, #1 // R3 ← R3 + 1771: ST (R0), R3 // M[1000] ← R3
Program counter (PC) păstrează adresa instrucţiunii curente în mod normal, PC se incrementează după execuţia fiecărei instrucţiuniîn mod excepţional acest comportament se schimbă prin instrucţiunile flow control
Copyright Paul GASNERCopyright Paul GASNER 15
JumpJumpO instrucţiune jump modifică valoarea PC
operandul specifică exact cum se schimbă PCpentru simplitate vom utiliza etichete în locul adreselor
Jump poate fi utilizată pentru repetarea unor instrucţiuni:
LD R1, #10LD R2, #3JMP L
K LD R1, #20 // Aceste două instrucţiuniLD R2, #4 // nu sunt executate acum
L ADD R3, R3, R2ST (R1), R3
LD R1, #0F ADD R1, R1, #1
JMP F // o buclă infinită
Copyright Paul GASNERCopyright Paul GASNER 16
BranchBranchO instrucţiune branch modifică valoarea PC în funcţie de starea de adevăr a unei condiţii
LD R1, #10LD R2, #3BZ R4, L // Jump to L dacă R4==0
K LD R1, #20 // Aceste două instrucţiuniLD R2, #4 // sunt executate sau nu
// în funţie de R4L ADD R3, R3, R2
ST (R1), R3
Copyright Paul GASNERCopyright Paul GASNER 17
BranchBranchCondiţiile pentru branch sunt de obicei rezultate ALUAici intervin biţii de stare ai ALU: V, C, N şi Z. Cu ajutorul acestora se pot implementa o serie de instrucţiuni branch
Condiţie Prescurtare ALU status bitsBranch on overflow BV V = 1Branch on no overflow BNV V = 0Branch if carry set BC C = 1Branch if carry clear BNC C = 0Branch if negative BN N = 1Branch if positive BNN N = 0Branch if zero BZ Z = 1Branch if non-zero BNZ Z = 0
Alte condiţii branch (de exemplu condiţii de mai mare, egal sau mai mic) sunt derivate din acestea
Copyright Paul GASNERCopyright Paul GASNER 18
R1 = *X;if (R1 < 0)
R1 = -R1;R3 = R1 + R1;
if-thenif-thenUn set de instrucţiuni în C se traduce în asamblor în felul următor
LD R1, (X) // R1 = *XBNN R1, L // Skip MUL if R1 este pozitivMUL R1, R1, #-1 // R1 = -R1
L ADD R3, R1, R1 // R3 = R1 + R1
Uneori este mai simplu şi mai rapid să se inverseze condiţiile: R1<0 înlocuit cu R1>=0
Copyright Paul GASNERCopyright Paul GASNER 19
R1 = 0;for (R2 = 1; R2 <= 5; R2++)
R1 = R1 + R2;R3 = R1 + R1;
looploop... sau pentru o buclă, utilizând o funcţie ipotetică BGT
LD R1, #0 // R1 = 0LD R2, #1 // R2 = 1
FOR BGT R2, #5, L // Stop when R2 > 5ADD R1, R1, R2 // R1 = R1 + R2ADD R2, R2, #1 // R2++JMP FOR // Go back to the loop test
L ADD R3, R1, R1 // R3 = R1 + R1
Copyright Paul GASNERCopyright Paul GASNER 20
CPUCPU
Unitatea de control „conectează” programul la ALUconverteşte instrucţiunile program în cuvinte comenzi pentru core, prin semnalele WR, DA, AA, BA, MB, FS, MW, MDexecută instrucţiunile program în ordinea corespunzătoaregenerează intrarea “constant” pentru ALU
Core trimite informaţii unităţii de control, de obicei pe biţii status V, C, N şi Z, care sunt verificaţi prin instrucţiunile branch de exemplu
ControlUnit
Core
Semnale Control
Semnale Status
Program
Copyright Paul GASNERCopyright Paul GASNER 21
Limbaj maşinăLimbaj maşinăLimbajul maşină este expresia binară a instrucţiunilor limbajului de asamblare, specifice CPUSunt 3 tipuri de instrucţiuni, deci 3 reprezentări binare:
instrucţiuni format registru – doi operazi din regiştriinstrucţiuni format constantă – un operand din regiştri şi celălalt este „constant”instrucţiuni format jump şi branch – o sursă registru şi o adresă din „constant”
E preferabilă o reprezentare cât mai asemănătoare pentru toate tipurile de formate (chiar dacă sunt diferite):
implementarea hard a unităţii de control este mai simplăvom încerca implementarea instrucţiunilor pe 16 biţi
Copyright Paul GASNERCopyright Paul GASNER 22
Format registruFormat registru
De exempluADD R1, R2, R3
O instrucţiune format registru cuprinde:câmpul opcod pe 7 biţi care specifică operaţiacâmpul pe 3 biţi registru destinaţie DRdouă câmpuri pe 3 biţi SA şi SB pentru selectarea regiştrilor sursă A şi B
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Registru
Destinaţie(DR)
SursăRegistru A
(SA)
SursăRegistru B
(SB)
Copyright Paul GASNERCopyright Paul GASNER 23
Format constantăFormat constantă
De exempluADD R1, R2, #3
O instrucţiune format constantă cuprinde:7 biţi codoperaţie3 biţi registru destinaţie DR3 biţi sursă registru A SA3 biţi operand constantă OP
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Registru
Destinaţie(DR)
SursăRegistru A
(SA)
Operand(OP)
Copyright Paul GASNERCopyright Paul GASNER 24
Format jump şi branchFormat jump şi branch
De exempluBZ R3, -24 JMP 18
O instrucţiune format registru cuprinde:7 biţi codoperaţie3 biţi sursă registru A SA (aceeaşi poziţie în toate formatele)6 biţi câmp adresă AD pentru stocarea adresei specificate de jump sau branch – număr cu semn pe 6 biţi, deci se poate sări peste 25-1=31 adrese înapoi sau 25=32 înainte
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Adresabit 5-3(AD)
SursăRegistru A
(SA)
Adresabit 0-2(AD)
Copyright Paul GASNERCopyright Paul GASNER 25
Formatul instrucţiunilorFormatul instrucţiunilor
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Adresabit 5-3(AD)
SursăRegistru A
(SA)
Adresabit 0-2(AD)
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Registru
Destinaţie(DR)
SursăRegistru A
(SA)
Operand(OP)
15 9 8 6 5 3 2 0
Cod operaţie (Opcod)Registru
Destinaţie(DR)
SursăRegistru A
(SA)
SursăRegistru B
(SB)
DR, SA şi SB sunt câmpuri 3 bits, deci se pot accesa maximum 8 regiştriSuport pentru mai mulţi regiştri sau numere mai mari implică mărirea lungimii în biţi a instrucţiunilor maşină
Copyright Paul GASNERCopyright Paul GASNER 26
Organizarea instrucţiunilorOrganizarea instrucţiunilorCriterii:
instrucţiuni similare au câmpuri opcod similaredupă semnalele de control, instrucţiunile se pot grupa în 8 categorii distincte
Tip instrucţiuniOperaţie Format Registru ALUOperaţie Deplasare Format RegistruScriere Memorie (din regiştri)Citire Memorie (în regiştri)Operaţie ALU cu constantăOperaţie deplasare constantăBranch CondiţionalJump
Copyright Paul GASNERCopyright Paul GASNER 27
Operaţii ALU format registruOperaţii ALU format registruADD R1, R2, R3
Toate operaţiile format registru trebuie să aibă semnalele de control:
MB = 0, toţi operanzii provin din setul de regiştriMD = 0 şi WR = 1, pentru a salva rezultatul ALU înapoi în regiştriMW = 0 deoarece RAM nu se modifică
D
Register file
A B
DA
AA BA
A B
ALU
G
FSVCNZ
1 0Mux B
MB 0
0 1Mux D
MD 0
ADRS DATA
Data RAM
OUT
MW 0
constant
Copyright Paul GASNERCopyright Paul GASNER 28
Operaţii ALU format registruOperaţii ALU format registruST (R0), R1
Toate operaţiile format registru trebuie să aibă semnalele de control:
MB = 0, toţi operanzii provin din setul de regiştriMD = X şi WR = 0, deoarece nici un registru nu se modificăMW = 1 pentru a scrie în RAM
D
Register file
A B
DA
AA BA
A B
ALU
G
FSVCNZ
1 0Mux B
MB 0
0 1Mux D
MD X
ADRS DATA
Data RAM
OUT
MW 1
constant
Copyright Paul GASNERCopyright Paul GASNER 29
Selecţie cod operaţieSelecţie cod operaţieInstrucţiunile din aceeaşi categorie au primii trei biţi din câmpul opcod (biţii 15-13 ai instrucţiunii)
Tip instrucţiuniOpcod
bit15
bit14
bit13
Operaţie Format Registru ALU 0 0 0Operaţie Deplasare Format Registru 0 0 1Scriere Memorie (din regiştri) 0 1 0Citire Memorie (în regiştri) 0 1 1Operaţie ALU cu constantă 1 0 0Operaţie deplasare constantă 1 0 1Branch Condiţional 1 1 0Jump 1 1 1
Copyright Paul GASNERCopyright Paul GASNER 30
Instrucţiuni ALU şi de deplasareInstrucţiuni ALU şi de deplasareBiţii 12-9 din opcod sunt ocupaţi cu cei 4 biţi ai funcţiei de selecţie FS din ALUDe exemplu, o instrucţiune XOR (pentru regiştri) va avea codul 0001100
primii 3 biţi indică o instrucţiune format regiştri pentru ALUultimii 4 biţi indică operaţia XOR
1011000 indică:101 – instrucţiune format constantă1000 – deplasare spre stânga cu un bit
FS Operaţie00000 F = A00001 F = A + 100010 F = A + B00011 F = A + B + 100100 F = A + B’00101 F = A + B’ + 100110 F = A – 100111 F = A01000 F = A ∧ B (AND)01010 F = A ∨ B (OR)01100 F = A ⊕ B01110 F = A’10000 F = B10100 F = sr B (shift right)11000 F = sl B (shift left)
Copyright Paul GASNERCopyright Paul GASNER 31
Instrucţiuni branchInstrucţiuni branch
Avem 8 condiţii diferite, deci sunt necesari 3 bitsBiţii 11-9 din opcod sunt ocupaţi cu cei 3 biţi care indică tipul de branchDe exemplu, instrucţiuna branch if zero va avea codul 110x011
primii 3 biţi pentru instrucţiunea tip branchultimii 3 biţi pentru if zero
Condiţie BCIf carry set 000If negative 001If overflow 010If zero 011If carry clear 100If positive 101If no overflow 110If non-zero 111
Copyright Paul GASNERCopyright Paul GASNER 32
Exemple cod operaţieExemple cod operaţieCâteva exemple de instrucţiuni şi câmpul opcod corespunzător în codul binar al instrucţiunii:
Instrucţiune Opcod bits (15-13) Opcod bits (12-9)LD R1, (R0) 011 (load) xxxx (unused)BZ R1, +4 110 (branch) x011 (branch on zero)SUB R5, R5, #1 100 (immediate arithmetic) 0100 (subtract)ADD R1, R0, R5 000 (register arithmetic) 0010 (add)JMP –3 111 (jump) xxxx (unused)
Unele coduri au biţi neutilizaţi:8 instrucţiuni branch, deci 3 biţi utilizaţiun singur tip de jump
Codurile neutilizate pot fi folosite la extinderea ulterioară a setului de instrucţiuni
Copyright Paul GASNERCopyright Paul GASNER 33
Exemple instrucţiuniExemple instrucţiuniCâteva exemple de instrucţiuni complete:
011xxxx 001 000110x011 000 001 100Jump/branch1000100 101 101 0010000010 001 000 101111xxxx 111 101Jump/branch
InstrucţiuneBits 15-9(Opcode) Bits 8-6 Bits 5-3 Bits 2-0 Format
LD R1, (R0) xxxConstantăBZ R1, +4SUB R5, R5, #1 ConstantăADD R1, R0, R5 RegistruJMP –3 xxx
Copyright Paul GASNERCopyright Paul GASNER 34
ISA. ConcluziiISA. ConcluziiUn program trebuie tradus în cod maşină pentru a putea fi executatExistă o corespondenţă biunivocă între limbajul de asamblare şi limbajul maşină (binar)Există trei tipuri de instrucţiuni:
manipularea datelor (operaţii ALU)operaţii cu regiştri şi cu RAMinstrucţiuni de salt – control flow
Alegerea codurilor binare pentru instrucţiuni se face astfel încât la instrucţiuni similare să corespundă coduri similare