3.2 Arhitectura setului de instrucţiuni –...

34
Copyright Paul GASNER Copyright Paul GASNER 3.2 Arhitectura setului de 3.2 Arhitectura setului de instrucţiuni – ISA instrucţiuni – ISA

Transcript of 3.2 Arhitectura setului de instrucţiuni –...

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