Tema 2: Instruccions i tipus de dades bàsics
11.1 Operands en registre
Vegeu Secció 2.6.1.
Problema 11.1 Traduïu els fragments següents de C a assemblador RISC-V. Suposeu que les variables f, g, h, i i j són enters de 32 bits assignats als registres t0, t1, t2, t3 i t4 respectivament.
f = g + h + i + jg = f + (h + 5) - i
Problema 11.2 Traduïu els fragments següents d’assemblador RISC-V a C. Suposeu que les variables f, g, h, i i j són enters de 32 bits assignats als registres t0, t1, t2, t3 i t4 respectivament.
11.2 Constants i immediats
Vegeu Secció 2.6.2 i RISC-V 2.16.
Problema 11.3 Donades les declaracions de variables del Codi 11.1, emmagatzemades a partir de l’adreça 0x10010000:
P, Q, R i S, amb paraules inicialitzades.
Tots els apartats parteixen del mateix estat inicial.
- Quin és el valor final de la variable
Qdesprés d’executar el Codi 11.2?
- Expliqueu textualment i de forma concisa què fa el Codi 11.3:
Nota: la sintaxi la label+offset és admesa a EC (teoria i exàmens), però a RARS cal substituir-la per la + addi.
Problema 11.4 Indiqueu quin és el contingut de memòria a partir de l’adreça 0x10010000, per paraules, per a la declaració de variables globals del Codi 11.4, amb les restriccions d’alineació de l’ABI (RISC-V 2.21; un .dword s’alinea a 8 bytes, encara que RARS 1.6 l’alinea a 4):
Problema 11.5 En RISC-V, la pseudoinstrucció li rd, imm s’expandeix en una sola instrucció real (addi) si l’immediat cap en 12 bits amb extensió de signe, i en dues (lui + addi) si no hi cap.
- Quina seqüència d’instruccions genera l’assemblador per carregar el valor
0xDEADBEEFal registret0? Calculeu els valors exactes dels operands de cada instrucció. - Per què cal ajustar el camp immediat d’
addiquan el bit 11 del valor original és 1? Il·lustreu-ho amb el valor0xDEADBEEF. - Quin és el rang de valors immediats que accepta
addi(és a dir, el rang de constants que es pot carregar a un registre ambaddi rd, zero, imm)? I quin és el rang de constants que es pot carregar a un registre amb la seqüèncialui+addi?
11.3 Operands en memòria
Vegeu Secció 2.6.3.
Problema 11.6 Donada la declaració de dades del Codi 11.5, emmagatzemada a partir de l’adreça 0x10010000:
Indiqueu quin és el valor en hexadecimal del byte emmagatzemat a cada una de les adreces 0x1001000C i 0x1001001C. Si no es pot determinar a partir de la declaració, indiqueu-ho amb la sigla de no aplicable (NA).
Problema 11.7 Donats els continguts inicials de registres i memòria següents (en hexadecimal):
t0 = 0x10010000, t2 = 0x10010008
| Adreça | Contingut (byte a byte, hex) |
|---|---|
0x10010000 |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |
0x10010010 |
00 00 00 00 EC FD 0E 0F 00 00 00 00 00 00 00 00 |
Determineu, per a cada instrucció, quin registre o adreça de memòria es modifica i quin és el seu contingut:
Problema 11.8 Donada la declaració del Codi 11.6:
Escriviu un fragment de no més de 12 línies de codi assemblador que guardi el valor complet de t1 (32 bits) a partir de l’adreça A+1, sense produir cap excepció d’alineació. Podeu escriure valors temporals a la posició A de memòria si cal (és una adreça alineada a paraula).
Problema 11.9 Indiqueu quin és el contingut de memòria a partir de l’adreça 0x10010000, byte a byte, per a la declaració de variables globals del Codi 11.7, amb les restriccions d’alineació de l’ABI (RISC-V 2.21; un .dword s’alinea a 8 bytes, encara que RARS 1.6 l’alinea a 4):
Problema 11.10 RISC-V és una arquitectura little-endian.
- Expliqueu què significa little-endian i en quin ordre s’emmagatzemen els bytes d’un enter de 32 bits a memòria.
- La variable global
int x = 0x12345678s’emmagatzema a partir de l’adreça0x10010000. Indiqueu el contingut byte a byte de les adreces0x10010000a0x10010003. - Després d’executar el Codi 11.8, quin valor té
t1? Raoneu la resposta tenint en compte l’ordre dels bytes.
- Quin hauria de ser el resultat si l’arquitectura fos big-endian?
Problema 11.11 Suposeu que el registre t0 conté l’adreça 0x10010000 i que la memòria té el contingut inicial següent:
| Adreça | +0 |
+1 |
+2 |
+3 |
|---|---|---|---|---|
0x10010000 |
11 |
22 |
CC |
DD |
- Determineu el valor dels registres resultants de l’execució de cada instrucció (de forma independent, partint sempre del contingut inicial de memòria). Raoneu l’extensió de signe o per zero quan sigui rellevant.
| Instrucció | Resultat al registre |
|---|---|
lb t1, 1(t0) |
|
lb t1, 2(t0) |
|
lh t1, 0(t0) |
|
lh t1, 2(t0) |
|
lbu t1, 2(t0) |
|
lhu t1, 2(t0) |
- Determineu l’estat final de la memòria després d’executar les instruccions del Codi 11.9 de forma seqüencial (una rere l’altra, partint del contingut inicial):
11.4 Representació de naturals i enters
Vegeu els problemes del Tema 1: Introducció: complement a 2, complement a 1, signe i magnitud i excés.
11.5 Representació de caràcters
Vegeu Secció 2.9.
Problema 11.12 Donades les declaracions del Codi 11.10:
u1 i u2, i el byte del resultat, d3.
Cadascuna de les dades u1 i u2 conté un caràcter ASCII que representa un dígit decimal individual. Escriviu un programa en assemblador que sumi els naturals representats per u1 i u2 i deixi el resultat en binari (natural) a d3. Com que cada operand és un sol dígit (rang \([0, 9]\)), la suma màxima és \(9+9=18\) i sempre cap en un sol byte.
Problema 11.13 Escriviu en hexadecimal el contingut de memòria ocupat per les declaracions del Codi 11.11, suposant que comencen a emmagatzemar-se a partir de l’adreça 0x10010000, amb les restriccions d’alineació de l’ABI (RISC-V 2.21):
Feu servir el format següent:
| Adreça | Contingut (byte a byte, hex) |
|---|---|
0x10010000 |
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |
0x10010010 |
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |
Problema 11.14 Escriviu en hexadecimal el contingut de memòria ocupat per les declaracions del Codi 11.12, suposant que comencen a emmagatzemar-se a partir de l’adreça 0x10010000. Recordeu que la directiva .align 0 desactiva l’alineació automàtica fins al final del segment .data actual (cap .align k amb \(k>0\) posterior no la reactiva):
.align 0 i .align 1.
Feu servir el format següent:
| Adreça | Contingut (byte a byte, hex) |
|---|---|
0x10010000 |
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |
0x10010010 |
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |
Problema 11.15 Donada la declaració en C:
- Traduïu la declaració a llenguatge assemblador RISC-V.
- Especifiqueu el valor hexadecimal de
t0després d’executar el Codi 11.13:
11.6 Format de les instruccions
Vegeu Secció 2.2.
Problema 11.16 Convertiu les instruccions d’assemblador RISC-V següents a llenguatge màquina (format binari i hexadecimal):
| Assemblador RISC-V | Binari | Hexadecimal |
|---|---|---|
add t4, t3, t5 |
||
addi t6, t5, 25 |
||
lw t3, 0(t2) |
||
sw t0, 0(t1) |
Problema 11.17 Desassembleu els valors hexadecimals següents a les instruccions RISC-V corresponents:
0x00B506330xFFC504130x0062A0230x0062A2B3(instruccióslt, presentada al Tema 3: Traducció de programes; vegeu Secció 3.3.1)
Problema 11.18 S’estudien dues modificacions possibles a l’arquitectura RISC-V:
- Passar de 32 registres a 8 registres.
- Passar de 12 bits per a l’operand immediat a 6 bits.
Per a cadascuna d’elles contesteu:
- Quin impacte tindria en la mida total d’una instrucció de tipus R?
- I en la mida total d’una instrucció de tipus I?
11.7 Punters
Vegeu Secció 2.7.
Problema 11.19 Suposeu les declaracions en C del Codi 11.14:
Suposant que r1 i r2 ocupen els registres t1 i t2, traduïu a assemblador RISC-V les sentències en C següents, pertanyents a main:
r1 = r2;*r1 = *r2;m1 = m2;*m1 = *m2;
Problema 11.20 Donada la declaració de dades global en C:
Traduïu a una única sentència en C el conjunt d’instruccions de cada apartat:
Problema 11.21 Donades les declaracions en C:
Traduïu a una única sentència en C el conjunt d’instruccions de cada apartat:
Problema 11.22 Donades les declaracions de variables globals en C:
Traduïu a assemblador RISC-V les sentències següents:
punterc++;punteri++;punterh++;punterd++;*punteri = *punteri + 5;*punterh = *punterh + 10;
Problema 11.23 Donades les declaracions en C:
C
Traduïu a assemblador RISC-V les sentències en C següents, pertanyents a main:
q = q + 1;a = *p;h = &c;b = *(q + b);*h = *(h + b);p[*q + 10] = a;h = &h[*p];
11.8 Vectors
Vegeu Secció 2.8 i Secció 2.8.5.
Problema 11.25 Donades les declaracions en C:
C
Traduïu les sentències en C següents, suposant que i, j i c ocupen els registres t0, t1 i t2:
i = val[5] + vec[10];i = vec[10 + val[5]];c = indx[i + val[j]];c = indx[meitat[i]];i = meitat[vec[i] + val[j]];i = val[meitat[i]] + vec[j];i = vec[indx[i]] - val[j];i = meitat[indx[val[j]]];
Problema 11.26 Donades les declaracions en C:
- Escriviu en assemblador RISC-V el bucle que inicialitza tots els elements de
va zero. - Escriviu el bucle que calcula la suma de tots els elements de
vi deixa el resultat asuma. - Escriviu el bucle que copia els elements de
val revés en un nou vectorwde la mateixa longitud declarat a continuació dev.
Problema 11.27 Donada la declaració en C:
Escriviu en assemblador RISC-V un fragment de codi que cerqui el valor de val dins vec i deixi a t2 l’índex de la primera ocurrència, o −1 si no s’hi troba.
Problema 11.28 Donades les declaracions en C:
C
- Escriviu en assemblador RISC-V la sentència
p = v + 3;i expliqueu de quants bytes s’incrementa el punter. - Escriviu el bucle que, usant el punter
p, dobla el valor de cada element del vector.
11.9 Cadenes de caràcters
Vegeu Secció 2.9.4.
Problema 11.29 Traduïu a assemblador RISC-V el programa en C del Codi 11.15, que escriu a la cadena minus els caràcters ASCII en minúscules corresponents a cada element del vector vec:
Problema 11.30 Escriviu en assemblador RISC-V una funció longitud que, donada una cadena de caràcters acabada en '\0' amb adreça base a a0, retorni la seva longitud (sense comptar el '\0') a a0.