Esercitazione del 21 Gennaio 2011
Es 1
Vedere appunti
Es 2
A = -15 B = -23
Traduco -15 e -23
001111 ! --- 110000
1 + --- 110001 <- -15
010111 ! --- 101000
1 + --- 101001 <- -23 A + B
110001 101001 + --- 1011010
Essendoci un overflow C = 1 (riporto)
N = 0 (per errore) Z = 0 (non è zero) V = 1 (overflow)
(fare prima la somma aritmetica decimale e vedere se ci sta)
A – B (prendo il 23 non complementato a 2 e lo sommo) 1 1111 //Riporti
110001 + 010111 = --- 1001000 C = 1 N = 0 Z = 0 V = 0
a, b, c, d
Mintermini in dec: 1,3,5,6,7,9,11,12.14. Traduco in binario
a b c d
1 0 0 0 1
3 0 0 1 1
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
9 1 0 0 1
11 1 0 1 1
12 1 1 0 0
14 1 1 1 0
Costruisco la mappa di Carnot, deve cambiare un solo bit ad ogni colonna. Metto 1 nei mintermini c/d a/b -> 0/0 0/1 1/1 1/0
0/0 1
0/1 1 1 1
1/1 1 1 1
1/0 1 1
La mappa di Carnot è toroidale o, per dirla meno da matematici, funziona come lo Snake sul cellulare, se uscite da un lato entrate dall’altro (Barenghi)
Vanno cerchiati a bit di potenze di 2 prendendo i più grandi possibili Le 4 bolle (evidenziate con i 4 colori diversi) vanno in or
Bolla rossa: a resta fermo a 0 (quindi negato), d resta fermo positivo -> ̅ Bolla azzurra: d fermo a 0, b fermo a 1, c fermo a 1 -> ̅
Bolla gialla: b fermo a 0, d fermo a 1 -> ̅
Bolla verde: a fermo a 1, b fermo a 1, d fermo a 0 -> ̅ ̅ ̅ ̅ ̅
Nella seconda parte ci viene chiesto di minimizzare a mano
G
abcd
abcd
abcd
abcd
Cercare di raccogliere a fattor comune. Ricordiamo che C or C negato è vero, C and C negato è falso
abd c c abd c c abd abd
ad b b ad
Ci ricordiamo dall’Amleto che essere o non essere è vero (Barenghi)
Es 4
Addr 32 b Int 32 b
f 1 -> ARG : D0 RET: A0 f 2 -> ARG : D0 RET : A0 INT * f1(INT), INT * f2(INT),
INT * funz(INT a, INT b) { INT* TMP
DO {
TMP = f1 (10 + a *(*f2(b)), //Moltiplicazione con un puntatore WHILE (TMP==NULL)
RETURN TMP, }
funz -> PUSH a,b
Situazione Pila TMP
RET A B
Tabella spiazzamenti:
TMP: -4 B: 8 A: 12 Assembly:
FUNZ: LINK FP, #-4 // Spazio per il ritorno a 32 bit -> 4 B MOVEM D0-D2/A0,-(SP) // Salvo i registri
A: EQ 12
B: EQ 8
TMP: EQ -4
LOOP: MOVE.L B(FP), D0 BSR F2
MOVE.L (A0), D1 // Tradotta *f2(b) MOVE.L A(FP), D0 // Carico A
MULS.L D1, D0
ADDI.L #10, D0 // Tradotta la moltiplicazione BSR F1
MOVEA.L A0, TMP(FP) CMPA.L #0.L, A0 BEQ LOOP
MOVEA.L TMP(FP), B(FP) MOVEM (SP)+, D0-D7/A0 UNLK.L FP
RTS
Es 5
A che indirizzo siamo per ognuna di queste righe?
Mem Word = 16 b Addr to Byte
ORG 2000 Indirizzo (byte):
DIM: EQ 20 2000
VECT 1: DS.L DIM 2000
VECT 2: DS.L DIM 2080
START: MOVEA.L #DIM.L, A0 2160 // + 16b istr, 32b per .L LOOP: BEQ FINISH 2166 // Branch -> 1 word -> 2B
MOVE.L VECT1(A0),D0 2168
MOVE.L VECT2(A0),VECT1(A0) 2172 MOVE.L D0, VECT2(A0) 2178
SUBI.W #1.W, D0 2183
CMP LOOP.W 2186 // Cmp con label (1W): 4B
END START 2190
Es 6
Microarchitettura a Bus singolo Da implementare
PUSHBLOCK: #NUMWORD, (R0)+
(num word 32 bit) Possiamo usare DECR
UPDATE_FLAG GOTO
IF (…) GOTO (…)
STEP CODE
1 PCOUT, MARIN, SELECT 4, ADD, ZIN, READ, WFMC
2 ZOUT, PCIN
3 MDROUT, IRIN
4 PCOUT, MARIN, SELECT 4 ADD, ZIN, READ, WFMC
5 ZOUT, PCIN
6 MDROUT, VIN, UPDATE_FLAG
7 IF (Z), GOTO (…)
8 ROUT, MARIN, READ, ADD, SELECT 4, ZIN, WFMC
9 ZOUT, R0IN
10 SPOUT, SELECT 4, SUB, ZIN
11 SPIN, MARIN, ZOUT, WRITE 12 SELECT V, DECREMENT, ZIN 13 ZOUT, VIN, IF (Z=0&N=0)GOTO (8)
HIT = 1 CLK
MISS = 20 CLK (19 + 1) HIT_RATE_IST = 90%
HIT_R_D = 80%
T1 = INT_R_I * HIT + (1-HIT_R_I)*MISS = 2,9 CLK TD = HIT_R_D * HIT + (1-HIT_R_D)*MISS = 4,8 CLK TM = w1 * T1 + WD * TD = 3,5 CLK
Es 8
Vedere appunti