Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DI
CALCOLATORI ELETTRONICI
Yuri Gaito
APPUNTI ASSEMBLER
-Allocare variabili globali
Interi
1) int a; a: .space 4
2) int a = 10; a: .word 10
Caratteri
1) char c; c: .space 1
2) char c = 'h'; c: .byte 'h'
Vettori
1) int vett [N]; vett: .space N*4
2) int b[] = {0, 1, 2, 3, 4}; b: .word 0, 1, 2, 3, 4
3) int b[] = {3, 3, 3, 3, 3}; b: .word 3:5
4) char vett[N]; vett : .space N
5) char b*+ = ,‘a’,’b’,’c’-; b: .byte ‘a’, ‘b’, ‘c’ oppure b: .ascii “abc”
Matrici
1) int mat [i][j]; mat: .space (i*j)*4
2) char mat [i][j]; mat: .space i*J
Stringhe
1) str = "Nuova stringa"; str: .asciiz "Nuova stringa \n"
-Ciclo FOR
-Gestione dell'I/O
2
-Passaggio dei parametri tramite Stack
Procedura Chiamante
1) Salvataggio dei registri modificabili $ti che contengono qualcosa che servirà in seguito
Acquisire le risorse necessarie sullo stack addi $sp, $sp, -X
Copiare i parametri nello stack usando l'istruzione di store
2) Salvataggio dei parametri da passare
Acquisire le risorse necessarie sullo stack addi $sp, $sp, -X
Copiare i parametri nello stack usando l'istruzione di store
3) Trasferire il controllo alla procedura jal nome_procedura
Procedura Chiamata
1) Salvare sullo stack i registri non modificabili $si che si vogliono utilizzare e il registro $ra
se verrà chiamata un'altra procedura
Acquisire le risorse necessarie sullo stack addi $sp, $sp, -X
Copiare i registri nello stack usando l'istruzione di store
2) Prelevare i parametri passati dallo stack usando l'istruzione di load
3) Esecuzione del compito richiesto
4) Ripristinare lo stato dei registri non modificabili
Copiare i registri dallo stack usando l'istruzione di load
Liberare le risorse acquisite sullo stack addi $sp, $sp, X
5) Inserire il valore di ritorno sullo stack usando l'istruzione di store
6) Ritornare al programma chiamante jr $ra
Procedura Chiamante
1) Prelevare il risultato dallo stack usando l'istruzione di load
2) Liberare lo spazio acquisito sullo stack per copiare i parametri addi $sp, $sp, X
Procedura Chiamante
1) Salvataggio dei registri modificabili $ti che contengono qualcosa che servirà in seguito
Acquisire le risorse necessarie sullo stack addi $sp, $sp, -X
Copiare i parametri nello stack usando l'istruzione di store
2) Salvataggio dei parametri da passare
3) Inserire i parametri nei registri $ai sw $?, 0($ai)
4) Trasferire il controllo alla procedura jal nome_procedura
Procedura Chiamata
1) Salvare sullo stack i registri non modificabili $si che si vogliono utilizzare e il registro $ra
se verrà chiamata un'altra procedura
Acquisire le risorse necessarie sullo stack addi $sp, $sp, -X
Copiare i registri nello stack usando l'istruzione di store
3
2) Prelevare i parametri passati dai registri $ai usando l'istruzione move $?, $ai
3) Esecuzione del compito richiesto
4) Ripristinare lo stato dei registri non modificabili
Copiare i registri dallo stack usando l'istruzione di load
Liberare le risorse acquisite sullo stack addi $sp, $sp, X
5) Inserire il valore di ritorno nei registri $vi
6) Ritornare al programma chiamante jr $ra
Procedura Chiamante
1) Prelevare il risultato move $?, $vi
2) Liberare lo spazio acquisito sullo stack per copiare i parametri addi $sp, $sp, X
Nota: Quando si fa la loadAdress (la) di una variabile globale il registro conterrà l'indirizzo della
variabile e non il suo valore! Per cui è necessario fare anche una load.
-Tabella ASCII
4
MEMORIE
Memoria Cache
-Indirizzamento diretto
Memoria Centrale
-Indirizzamento set-associativo
Blocco
Memoria Cache a 2 vie
Memoria Centrale
1
Memoria Virtuale
1 IndirizzoPaginaFisica
-Potenze di 2
IF ID MEM WB
EXE
3) A seconda del tipo di propagazione valutare se inserire o meno delle bolle (Ricorda che è
possibile propagare solo in avanti e non in colpi di clock precedenti!)
4) Per capire se si può propagare o meno considera dove il dato è pronto e dove ti serve
-Algoritmo
-Circuito logico
1
DIVISORI
-Settare i valori iniziali dei registri
1) Il Resto sarà di 2n bit, dove n è il numero di bit del Divisore, ed è uguale al Dividendo al quale
bisogna aggiungere n zero davanti (Resto = n0+Dividendo)
2) Aggiungi al Divisore n zero in coda
3) Il Quoziente è 0 (n bit)
-Algoritmo
1) Sottrai il registro Divisore dal registro resto e metti il risultato nel registro Resto
2) Controlla Resto (guarda primo bit da sinistra)
a) Se il Resto è ≥ 0 esegui lo scorrimento a sinistra del registro Quoziente mettendo un 1
nel nuovo bit più a destra
b) Se il Resto è < 0 Ripristina il valore originale sommando il registro Divisore al registro
Resto e mettendo la somma nel registro Resto. Esegui inoltre lo scorrimento a sinistra del
registro Quoziente, forzando a 0 il nuovo bit meno significativo.
3) Esegui lo scorrimento a destra di 1 bit del registro Divisore
4) Se non sei arrivato all'n+1-esimo passo comincia da capo (n è il numero di bit degli
operandi)
-Circuito logico
Se Dividendo e Divisore sono dati in modulo e segno per eseguire la divisione si esegue la divisone
senza segno (togliendo il primo bit a sinistra a entrambi) e si calcola a parte il segno. Il Quoziente è
negativo se i segni di Dividendo e Divisore sono opposti, il Resto, quando non è 0, ha lo stesso
segno del dividendo.
2
MACCHINE ELEMENTARI
-ENCODER
n-Ingressi m-Uscite
È una macchina che riceve in ingresso n
. .
bit e ha in uscita log2 n = m bit che
. .
. . rappresentano una specifica codifica
. .
EN
-DECODER
m-Uscite
n-Ingressi
È una macchina che riceve in ingresso n
.
bit e ha in uscita 2m di cui solo 1/m è
. .
.
.
.
. selezionato come attivo
EN
-MULTIPLEXER
S
n-Ingressi m-Uscite
È una macchina che seleziona una delle
M 2n entrate in base al segnale di selezione
U S
X
EN
-ADDIZIONATORE
R
A
È una macchina utilizzata per sommare due
O numeri (A e B). L'uscita O contiene la loro somma
mentre R e r sono rispettivamente il riporto in
B uscita e in entrata
r
-SOTTRATTORE
È una macchina utilizzata per sotrrarre due
R
A numeri (A e B). L'uscita O contiene la loro
O differenza mentre R e r sono rispettivamente il
Zero riporto in uscita e in entrata. Il segnale zero
B P/N rappresenta che la sottrazione è zero (quindi i
r
numeri sono uguali), il segnale P/N rappresenta
se la somma è positiva o negativa.
-REGISTRO A SCORRIMENTO