Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tempo a disposizione 1 h : 30 m
Si deve tradurre in linguaggio macchina simbolico (assemblatore) MIPS il frammento di programma C ripor-
tato sotto. Il modello di memoria è quello standard MIPS e le variabili intere sono da 32 bit. Non si tenti
di accorpare od ottimizzare insieme istruzioni C indipendenti. Si facciano le ipotesi seguenti:
il registro “frame pointer” fp non è in uso
le variabili locali sono allocate nei registri, se possibile
vanno salvati (a cura del chiamante o del chiamato, secondo il caso) solo i registri necessari
Si chiede di svolgere i quattro punti seguenti (usando le varie tabelle predisposte nel seguito):
1. Si descriva il segmento dei dati statici dando gli indirizzi assoluti e gli spiazzamenti delle variabili globali
rispetto al registro global pointer gp, e si traducano in linguaggio macchina le dichiarazioni delle varia-
bili globali.
2. Si descrivano l’area di attivazione della funzione minimum e l’allocazione delle variabili locali e dei pa-
rametri di minimum nei registri.
3. Si traduca in linguaggio macchina il codice degli statement riquadrati nel prog. principale main.
4. Si traduca in linguaggio macchina il codice dell’intera funzione minimum (vedi tab. 4 strutturata).
s0 516
s1 512
tmp 0
indirizzi bassi
La funzione non è foglia, pertanto salva il reg ra in pila. Le varloc I e W sono allocate nei registri s0 e s1, e
tali registri vanno salvati in pila. La varloc di tipo array TMP va allocata in pila (essendo strutturata non può
andare nei registri), nell’area di attivazione, subito sotto le due celle dove salvare i registri s0 e s1 che
ospitano le varloc scalari I e W, e lo stack pointer sp punta esattamente all’elemento TMP [0], ossia
all’elemento iniziale di TMP.
addr a0
i s0
w s1
// print (min)
DO: // do
// w = vet [i]
la $t0, VET // carica indir iniz array glob VET
sll $t1, $s0, 2 // allinea indice I
addu $t0, $t0, $t1 // calcola indir elem VET [I]
lw $s1, ($t0) // carica VET[I] e aggiorna varloc W
// tmp [i] = w
sll $t1, $s0, 2 // allinea indice I (si può riusare)
addu $t0, $sp, $t1 // calcola indir elem TMP [I]
sw $s1, ($t0) // aggiorna elem TMP [I]
// i++
addi $s0, $s0, 1 // aggiorna varloc I
// while (i != N)
li $t2, N // carica cost N
bne $s0, $t2, DO // confronta e vai a DO
// sort (tmp, i)
move $a0, $sp // prepara arg ADDR
move $a1, $s0 // prepara arg LEN
jal SORT // chiama funz SORT
.data .data
TMP .space 512 LENGTH .space 12
SUP .space 4 RANGE: .word 17
INF .word 0 .text
.text .globl ENDLESS
.globl MAIN ENDLESS: lw $t2, INF
MAIN: addi $t0, $zero, 36 beq $t2, $zero, MAINEND
sw $t0, SUP lw $t3, RANGE
jal ENDLESS beq $t3, $zero, ENDLESS
MAINEND: la $t1, TMP ENDEND: j ENDEND
dimensione testo: 14 hex (20 dec) dimensione testo: 14 hex (20 dec)
dimensione dati: 208 hex (520 dec) dimensione dati: 10 hex (16 dec)
testo testo
dati dati
indirizzo (hex) contenuto (in esadecimale) indirizzo (hex) contenuto (in esadecimale)
0 non specificato 0 non specificato
200 non specificato C 11
204 0 10
indirizzo (hex) cod. operativo simbolo indirizzo (hex) cod. operativo simbolo
4 sw SUP 0 lw INF
8 jal ENDLESS 8 beq MAINEND
C lui TMP C lw RANGE
10 ori TMP 10 beq ENDLESS
14 j ENDEND
base del testo: 0040 0000 base del testo: 0040 0014
base dei dati: 1000 0000 base dei dati: 1000 0208
0040 0028
X
forma
d’onda
X 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
D 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0
Q 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
F 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0
CLK
1. Completare la tabella sottostante con i valori dell’uscita U. Per facilitare lo svolgimento, le colon-
ne A, B e C che rappresentano gli ingressi della rete sono già state completate.
A B C U
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1
2. Progettare la rete in prima forma canonica (forma SOP, somma di prodotti). Scrivere l’espressione
della prima forma canonica di U in funzione di A, B e C, senza ricorrere a semplificazioni o minimiz-
zazioni:
U = _________________________________________________ !A !B C + !A B !C + A !B !C + A B C
3. Considerata l’espressione ottenuta al punto precedente, manipolarla con le regole dell’algebra di Boole in
modo da ottenere un’espressione equivalente contenente solamente operatori XOR.
Espressione di partenza !A !B C + !A B !C + A !B !C + A B C
!A ( !B C + B !C ) + A ( !B !C + B C )
A xor B xor C
La pipeline non è ottimizzata per la gestione dei conflitti di controllo. Si consideri il ciclo di clock in cui
l’esecuzione delle istruzioni nei vari stadi è la seguente:
X 0 1
.WB.RegWrite .WB.RegWrite .WB.RegWrite
0 1 1
.M.MemWrite .M.MemWrite
0 0
.M.MemRead .M.MemRead
0 0
.M.Branch .M.Branch
1 0
.PC .PC .PC
***********
.imm/offset esteso .ALU_out somma addi .ALU_out ind memoria lw
FFFF FFFE 0000 A21E 1000 AAA4
.EX.ALUSrc .Zero .DatoLetto
0 0 1AA1 3332
.EX.RegDest
segnali relativi al RF (subito prima del fronte di DISCESA interno al ciclo di clock)
RF.RegLettura1 RF.DatoLetto1 RF.RegScrittura
1. lw $3, 4($1)
2. add $1, $3, $2
3. sw $1, 4($3)
ciclo di clock
ID
1‐lw IF
1
EX M WB 3
istruzione
ID
2‐add IF
3, 2
EX M WB 1
Si risponda alle domande seguenti, facendo l’ipotesi che la pipeline sia dotata dei seguenti percorsi di propa-
gazione: EX/EX, MEM/EX e MEM/MEM.
NOTA BENE: per percorsi attivi nello stesso ciclo di clock e riferiti alla stessa istruzione, utilizzare una
sola colonna per rappresentarli.
Tabella 3
istruzione che ne
usufruisce
2 (add) 3 (sw)
tipo(i)
MEM-EX (rs) EX-EX (rt)
di propagazione
ID / EX.Rs $3 $3
segnali di ingresso all’unità di propagazione
ID / EX.Rt $2 $1
EX / MEM.R v.s. $1
EX / MEM.RegWrite 0 (stallo) 1
MUX di propagazione
interessato
PA PB
ingresso di selezione
segnali di uscita
di propagazione
MUX PA
01 00
dell’unità
ingresso di selezione
MUX PB
00 10