Tema 4: Aritmètica entera i matrius
13.1 Suma i resta
Vegeu Secció 4.2 i Secció 1.6.
Problema 13.1 Convertiu a decimal els nombres 0x0D34 i 0xBA1D:
- Suposant que representen naturals.
- Suposant que representen enters en complement a 2.
- Suposant que representen enters en signe-magnitud.
Problema 13.2 Siguin els nombres: \(A =\) 0x0D34, \(B =\) 0xDD17, \(C =\) 0xBA1D, \(D =\) 0x3617.
- Quant val, en hexadecimal, la suma \(A+B\) si representen naturals de 16 bits?
- Ídem per a la suma \(C+D\).
- Quant val, en hexadecimal, la suma \(A+B\) si són enters en signe-magnitud de 16 bits?
- Ídem per a la suma \(C+D\).
Problema 13.3 Siguin els nombres: \(A =\) 0xBA7C, \(B =\) 0x241A, \(C =\) 0xAADF, \(D =\) 0x47BE.
- Quant val, en hexadecimal, la resta \(A-B\) si representen naturals de 16 bits?
- Ídem per a la resta \(C-D\).
- Quant val, en hexadecimal, la resta \(A-B\) si són enters en signe-magnitud de 16 bits?
- Ídem per a la resta \(C-D\).
Problema 13.4 Per a les operacions següents amb naturals de 8 bits, codifiqueu els operands en binari, realitzeu l’operació i indiqueu si s’ha produït ròssec (carry) o, en el cas de la resta, préstec (borrow). Convertiu el resultat a decimal:
- \(200 + 50\)
- \(25 + 34\)
- \(254 + 3\)
- \(128 - 20\)
Problema 13.5 Per a les operacions següents amb enters en Ca2 de 8 bits, codifiqueu els operands en binari, realitzeu l’operació i indiqueu si s’ha produït desbordament (overflow). Convertiu el resultat a decimal:
- \((-25) + (-34)\)
- \((-25) - (-34)\)
- \((+127) - (-20)\)
- \((-128) - (-20)\)
Vegeu Secció 4.2.1.
Problema 13.6 Donades dues variables naturals de 32 bits emmagatzemades a t1 i t2, escriviu un fragment de codi que calculi la seva suma (t0 = t1 + t2) i determini si s’ha produït ròssec, desant 1 a t3 en cas afirmatiu i 0 altrament. El fragment no ha de contenir cap instrucció de salt.
Indicació: si es produeix ròssec, el resultat t0 és menor que qualsevol dels dos sumands.
Problema 13.7 Donades dues variables enteres de 32 bits emmagatzemades a t1 i t2, escriviu un fragment de codi que calculi la seva suma (t0 = t1 + t2) i determini si s’ha produït desbordament (overflow). El fragment no ha de contenir cap instrucció de salt.
Indicació: hi ha desbordament si i només si els dos sumands tenen el mateix signe i el resultat té signe oposat. A RISC-V, la detecció es fa combinant operacions lògiques bit a bit i desplaçaments sobre els bits de signe.
Vegeu Secció 4.2.3 i Exemple 4.1.
13.2 Multiplicació
Vegeu Secció 4.3.
Problema 13.9 Donat el diagrama del multiplicador seqüencial de naturals de 32 bits estudiat a la teoria, que calcula el producte de 64 bits, completeu l’algorisme iteratiu que en descriu el funcionament cicle a cicle, indicant el valor inicial dels registres i les operacions de cada iteració.
Vegeu Algorisme 4.1.
Problema 13.10 Seguint el circuit multiplicador seqüencial, descriviu els passos per a la multiplicació dels naturals de 6 bits \(x\) (multiplicand) i \(y\) (multiplicador), calculant en cada pas el valor dels registres P, MD i MR en binari:
- \(x =\)
101000, \(y =\)010011. - \(x =\)
110110, \(y =\)000100.
Vegeu Algorisme 4.1 i Exemple 4.3.
Problema 13.11 Seguint el mateix algorisme del circuit multiplicador, i sense usar cap instrucció de multiplicació, escriviu un fragment de codi en assemblador RISC-V que calculi el producte de dos naturals de 32 bits guardats als registres t0 i t2. El resultat de 64 bits s’ha de guardar a t3 (part baixa) i t4 (part alta).
Vegeu Algorisme 4.1.
Problema 13.12 Siguin x, y i z variables de 32 bits emmagatzemades a t1, t2 i t3. Escriviu un fragment de codi en RISC-V que calculi z = x * y i escrigui a t0 el valor 0 si el resultat és correcte o 1 si s’ha produït desbordament. El fragment no ha de fer servir cap instrucció de salt. Considereu:
unsigned int x, y, z;int x, y, z;
Vegeu Secció 4.3.4.
Problema 13.13 Completeu el contingut que han de tenir els registres operands de les instruccions següents perquè siguin coherents després de la seva execució. Considereu cada instrucció de manera independent:
mul t3, t1, t2— el resultat als 32 bits de menys pes és0xFFFFFFFA;t1 = 0x00000002; calculeu el valor det2.div t3, t1, t2(divisió entera, truncament cap a zero) —t1 = 0x00000005,t2 = 0xFFFFFFFE; calculeu el quocient at3i el residu.- En quins casos concrets pot produir-se desbordament en una divisió entera?
13.3 Matrius
Vegeu Secció 4.5.
Problema 13.14 Donades les declaracions en C, on NF i NC són constants:
Escriviu el codi RISC-V per calcular les adreces dels elements següents, fent servir el nombre mínim d’instruccions i deixant el resultat a a0. Suposeu que i i j estan emmagatzemades a t0 i t1:
mat[3][11]mat[i][11]mat[3][j]mat[i][j]mat[i+5][j-1]mat[i*10+4][6]
Vegeu Equació 4.3.
Problema 13.15 Traduïu a assemblador RISC-V la funció del Codi 13.1, on N és una constant:
Problema 13.16 Donada la declaració de variable global (on N és una constant):
Traduïu a assemblador RISC-V el fragment de codi en C del Codi 13.2, usant el nombre mínim d’instruccions, suposant que i i suma ocupen els registres t0 i t1:
Problema 13.17 Sigui la declaració en C:
Si el registre t0 és un punter que apunta a l’element mat[i][j], és possible modificar t0 amb una sola instrucció perquè apunti a mat[i-3][j+5]? Si la resposta és sí, escriviu-la.
Problema 13.18 Sigui la declaració de la variable global:
Suposant que inicialment t0 conté l’adreça de l’element mat[4][45], a quin element de la matriu apunta t0 després d’executar la instrucció del Codi 13.3?
Problema 13.19 Donades les declaracions en C:
El fragment de codi RISC-V del Codi 13.4 correspon a la traducció de la sentència incògnita. Determineu quina és aquesta sentència i expresseu-la en C, tenint en compte que t0 conté la variable j:
Problema 13.20 Donades les declaracions en C:
C
- Traduïu a RISC-V la subrutina
funcamb accés seqüencial al vectorveci, suposant quejocupat0. - Traduïu a RISC-V la subrutina
mainamb accés seqüencial a la matriumati.
13.4 Accés seqüencial
Vegeu Secció 4.6.
Problema 13.21 Donades les declaracions en C (on N és una constant):
Traduïu a RISC-V les sentències següents usant accés seqüencial per als accessos a A, suposant que i, j i suma ocupen t0, t1 i t2:
Problema 13.22 Donades les declaracions en C:
C
Traduïu a RISC-V les sentències següents usant accés seqüencial, suposant que i ocupa t0:
Problema 13.23 Siguin les declaracions en C:
- Traduïu a RISC-V la sentència del Codi 13.5, que pertany a
func:
- El Codi 13.6, en assemblador RISC-V, s’ha obtingut en traduir el bucle del Codi 13.7 implementant accés seqüencial. Completeu les quatre constants inicials perquè la traducció sigui correcta:
Problema 13.24 Donades les declaracions en C:
Traduïu a assemblador RISC-V el codi del Codi 13.8 amb accés seqüencial i un sol punter:
Problema 13.25 Donades les declaracions en C:
- Traduïu a C, amb una única sentència, el fragment d’assemblador RISC-V del Codi 13.9, sabent que forma part del cos d’
examen:
- El fragment incomplet de codi C del Codi 13.10 i el de RISC-V del Codi 13.11 pertanyen al cos d’
exameni inicialitzen tots els elements dep1a zero amb accés seqüencial. Completeu les tres sentències que falten en C i les línies corresponents en assemblador, suposant queiipes guarden at0it1:
Problema 13.26 La funció func recorre la matriu matriu amb un punter. Suposeu que N i M són constants, amb \(N \leq M\):
func, que recorre matriu amb un punter.
- Enumereu els elements de la matriu que s’escriuen i indiqueu quin valor s’assigna a cada un.
- Traduïu a RISC-V el bucle del Codi 13.12 usant accés seqüencial, suposant que
iipocupent0it1.
Problema 13.27 La funció fila_dispersa escriu els elements de la fila i d’una matriu dispersa, representada pels vectors A, IA i JA, a les posicions corresponents de la matriu global mat:
fila_dispersa.
- Dels accessos a memòria que fa el bucle del Codi 13.13 (
IA[i],IA[i+1],JA[k],mat[i][JA[k]],A[k]), quins es poden traduir amb accés seqüencial i quins només amb accés aleatori? - Traduïu la funció
fila_dispersausant accés seqüencial per als recorreguts que ho permetin, suposant quekes guarda at0.
Problema 13.28 Donada la versió inicial del bucle del Codi 13.14 (on N és una constant i v és un vector global d’enters):
- Identifiqueu quantes instruccions s’executen per iteració i calculeu el temps total en cicles per a \(N\) iteracions (useu el model de costos: memòria = 4 cicles, salt pres = 2, salt no pres = 1, resta = 1).
- Apliqueu l’optimització de condició al final del bucle (
do-while). Escriviu la versió optimitzada i calculeu de nou el temps total. - Quina reducció percentual del temps s’obté per a \(N = 100\)?
Vegeu Secció 4.6.2.
Problema 13.29 Donada la declaració (on N és una constant):
El bucle for (i = 0; i < N; i++) w[i] = v[i] * 2; es pot optimitzar eliminant la variable d’inducció i.
- Escriviu la versió assemblador RISC-V sense cap optimització (usant
iexplícitament, amb la condició avaluada a l’inici del bucle). - Apliqueu l’eliminació de la variable d’inducció: useu dos punters que avancin directament i elimineu tots els càlculs d’adreça, mantenint la condició avaluada a l’inici. Escriviu la versió optimitzada.
- Combineu l’eliminació de la variable d’inducció (b) amb l’avaluació de la condició al final. Quantes instruccions té el cos del bucle resultant?
Vegeu Secció 4.6.1, Secció 4.6.2 i Secció 4.6.3.
13.5 Divisió
Vegeu Secció 4.4.
Problema 13.30 Donat el diagrama del divisor seqüencial de naturals de 32 bits amb restauració estudiat a la teoria, que calcula el quocient i el residu, completeu l’algorisme iteratiu que en descriu el funcionament cicle a cicle.
Vegeu Algorisme 4.2.
Problema 13.31 Seguint el circuit divisor seqüencial amb restauració, descriviu els passos per a la divisió dels naturals de 6 bits \(x\) (dividend) entre \(y\) (divisor), calculant en cada pas el valor dels registres Q, D i R en binari:
- \(x =\)
101000, \(y =\)010011. - \(x =\)
010101, \(y =\)100100.
Vegeu Algorisme 4.2 i Exemple 4.7.
Problema 13.32 Seguint el mateix algorisme del circuit divisor, i sense usar cap instrucció de multiplicació ni divisió, escriviu un fragment de codi en assemblador RISC-V que calculi el quocient i el residu de la divisió de dos naturals de 32 bits: el dividend al registre t3 i el divisor a t1. El quocient s’ha de guardar a t2 i el residu a t3.
Vegeu Algorisme 4.2.