Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Lezione 2: 29/03/23
Il nostro processore MIPS che utilizziamo in questo corso ha a disposizione:
- 6 bit per il codice operativo
- 5 bit per il registro
- 5 bit per l'offset
- 32 bit per il bus degli indirizzi
Il problema che sorge subito è che siccome ogni istruzione deve essere composta da soli 32 bit questo adesso risulta impossibile.
Nota:
6 + 5 + 5 + 16 + 32 = 59 bit ➔ 32 bit
Per questo motivo allora andiamo ad utilizzare un indirizzamento indiretto al registro.
Con questo tipo di indirizzamento vado a caricare l'indirizzo di destinazione in un registro detto "istruzione" in base a specificare quale indirizzo fornisce questa istruzione.
Osserva:
- Registro dove carico l'indirizzo di destinazione
- è di 5 bit - Contiene l'indirizzo base a cui va sommato l'offset per identificare qual è la cella di memoria oggetto dell'istruzione.
Così facendo ottengo che ho:
- 6 bit codice operativo
- 5 bit registro
- 16 bit offset
- 5 bit registro per l'indirizzo
- 32 bit rispettando il vincolo
Nota:
Il bus dati è anch'esso di 32 bit
ISTRUZIONI DI LETTURA E SCRITTURA:
(1) LW $A5, 0($2)
- REGISTRO
- DOVE VADO A SALVARE IL DATO
(2) SW $A5, 4($2)
- INDIRIZZO
- DOV'È CONTENUTO IL DATO CHE VOGLIO SCRIVERE IN MEMORIA
ESEMPIO DI PROGRAMMA:
(SCAMBIO DI VARIABILI)
- Temp = V[CK]
- V[CK] = V[CK+1]
- V[CK+1] = Temp
LW $A5, 0($2)
LW $A6, 4($2)
SW $A5, 4($2)
SW $A6, 0($2)
LEZIONE 3:
15/03/21
MENTRE SE HO OVERFLOW L'OPZIONE "REGISTRO PER IL FLAG" È PIÙ SEMPLICE PERCHÉ IL PROCESSORE MIPS AVREBBE INTERROGATO IL FLAG COMPIE LE AZIONI NECESSARIE PER AFFRONTARE TALE PROBLEMA.
* OSserva: *
La scelta di non adottare un registro per il flag sul MIPS è stata posta tenendo presente che con un bus dati pari a 32 bit la probabilità di avere overflow è molto bassa e quindi la scelta ottimale è l'intercursus eccezione.
* Program counter: *
Nella maggior parte dei processori per il problema di programmi nidificati si utilizza lo stack gestito dallo stack pointer. Questo vuol dire che quando vado a chiamare un sotto-programma "in automatico" il program-counter verrà collocato all'interno della memoria.
Questo però non avviene nel processore MIPS.
Nel MIPS abbiamo dei procedimenti per la gestione di sottoprogrammi, questo piano piano non fa riferimento allo stack ma fa riferimento ad un registro istituito alla CPU detto RETURN ADDRESS ($ra). In condizioni normali, quando il processore vuole rinviare un sotto-programma eseguirà un apposito salto e salverà l'indirizzo di ritorno in $ra.
Quando invece ho programmi nidificati per passare da un sotto-programma ad un'altro non posso usare in alcun $ra perché sovrascriverei tale indirizzo esso percorre l'indirizzo di ritorno al main program.
In questo caso posso se lo vado a salvare in memoria nello stack (questo e l'opposto è architettura).
Nota:
Quando delle semplici chiamate a sotto-programma allo stesso modo ripeto agli altri processori perché così sostano salvare lo stato nel registroin caso di programmi nidificati invece sarà reinviato.
* OSserva: *
Questa scelta è stata posta tenendo conto che statisticamente la probabilità di avere programmi nidificati è bassa e in media questo metodo è vantaggioso.
SCAMBIO:
muli $2 $5 4add $2 $4 $2lw $4 0($2)lw $5 4($2)sw $4 4($2)sw $5 0($2)jr $23$2 = K * 4 = OFFSET
V[K] -> V[0] + OFFSET
jr -> Jump to register
RITORNO AL MAIN PROGRAM
NOTA:
V[0] 4 ByteV[1] 4 ByteV[2] 4 ByteV[3] 4 Byte$2 = 0 * 4
$2 = 2 * 4
$2 = 3 * 4
MOTRIPLICAZIONE
NON POSSO USARLO COME ISTRUZIONE NON C'È NELLA REALTÀ
ALTERNATIVA A MULI:
1°)add $8, $5, $5add $2, $8, $8$8 = K + K
$2 = 2K + 2K
2°)sll $2, $5, 2SHIFT-LOGICO A SINISTRA (MOLTIPLICAZIONE) DI DUE, C'È VOL DIRE MOLTIPLICARE PER 4
$2 = K * 4
LA TERAYIONE È PIÙ VELOCE
ESPLICE RISPETTO ALL'ADDIZIONE
.RIEPILOGO:
add $s3, $s2, $s3 $s3 = $s2 + $s3sub $s3, $s2, $s3 $s3 = $s2 - $s3sw $s0, 100($s2) Memory [$s2 + 100] = $s3lw $s0, 100($s2) $s3 = Memory [$s2 + 100]NOTA:
IL PROGRAM COUNTER SI MUOVE IN MOLTIPLI DI 4, QUESTO PERCHE' LE ISTRUZIONI SONO DA 4 BYTE CIASCUNA.
FORMATO J:
CON 26 BIT NON POSSIAMO RAPPRESENTARE UN INDIRIZZO PERCHE' CE NE VORREBBERO 32.
MA SICCOME GLI INDIRIZZI CHE VORRO' RAPPRESENTARE SARANNO INDIRIZZI ALLINEATI MOLTIPLICI DI 4, QUEI 26 BIT E' COME SE POSSEDERO 28 BIT, QUESTO PERCHE' OGNIQUALSIASI INDIRIZZO POSSIBILE NEL PC AVRA' I DUE BIT MENO SIGNIFICATIVI POSTI A ZERO.
QUESTA 26 BIT PRIMA DI ESSERE UTILIZZATI SARANNO TRASLATI DI DUE POSIZIONI A SINISTRA (MOLTIPLICATI PER 4), AVENDO COSI' DI FATTO 28 BIT.
I 4 BIT MANCANTI, PER LA CORRETTA RAPPRESENTAZIONE DELL'INDIRIZZO, VERRANNO EROGATI DEL PROGRAM COUNTER.
4 BIT DEL PC 36 BIT ADDRESS ZERI
4 BIT 26 BIT 2 BIT
NOTA:
QUESTO PROG. FA SI CHE IO NON POSSA RAGGIUNGERE QUALSIASI POSIZIONE DI MEMORIA, MA SOLO QUESTE POSIZIONI APPARTENENTI AL MACRO BLOCCO DESCRITTO DAI 4 BIT PIU' SIGNIFICATIVI.
I 4 BIT PIU' SIGNIFICATIVI IDENTIFICANO 2^4 = 16 MACRO BLOCCHI.
LEZIONE 7: 29/03/23
ISTRUZIONI DI CONTROLLO DEL FLUSSO:
IF ($s3 < $s2) $t0 = 0ELSE $t0 = 0slt $t0, $s3, $s2
addi $v0, $zero, $zerolw $t0, 0($sp)lw $t1, 4($sp)lw $t2, 8($sp)addi $sp, $sp, +12jr $raNOTA:
L'istruzione addi, non è di tipo 'R' ma di tipo 'I'; questo perché ho una sola tra due operandi è una costante.
Se nel sottoprogramma siamo in grado di usare solo i registri $t0 non abbiamo l'obbligo di dover usare lo stack.Se invece i registri $t0 non bastano e quindi abbiamo la necessità di usare i registri $s allora dobbiamo garantireche al ritorno al main-program i valori $s originalisiano ripristinati.
Se però nel main-program i registri $sx assumono dei valori che non devono essere persi allora prima della chiamata al sottoprogramma vanno salvati nello stack e poi dopoessere ritornati al main-program vanno ripristinati.
REGISTRI E CONVENZIONI:
- NOME: NUMERO REGISTRO: USO:
- $zero 0 Zero
- $v0-$v1 2-3 Restituire valori sottoprogrammi
- $a0-$a3 4-7 Argomenti per sottoprogrammi
- $t0-$t7 8-15 Variabili temporanee
- $s0-$s7 16-23 Variabili non temporanee
- $t8-$t9 24-25 Variabili temporanee
- $gp 28 Global-pointer
- $sp 29 Stack-pointer
- $fp 30 Frame-pointer
- $ra 31 Return-address
- ★ RegistRi Preservati
- ★ Registri non preservati