Tema 3: Traducció de programes
12.1 Operacions lògiques i desplaçaments
Vegeu Secció 3.1 i Secció 3.2.
Problema 12.1 Calculeu el resultat en hexadecimal de les operacions lògiques bit a bit següents amb 16 bits:
0x7654 | 0x33330x7654 & 0x33330x7654 << 20x7654 >> 3(desplaçament lògic)
Problema 12.2 Donada la sentència en C:
Traduïu-la a assemblador RISC-V sense utilitzar la instrucció xor. Recordeu que l’operació és equivalent a:
Problema 12.3 Escriviu les seqüències de codi necessàries per deixar a t1 el resultat de les condicions lògiques següents, sense fer servir instruccions de salt. El valor final de t1 ha de ser 0 si la condició no es compleix, o diferent de zero altrament.
- L’enter representat per
t1és negatiu. - L’enter representat per
t1és múltiple de 4. - El natural representat per
t1és tal que el seu quadrat no es pot escriure amb 32 bits. - El natural representat per
t1és tal que el seu doble no es pot escriure amb 32 bits. - Els bits 1, 3 i 5 de
t1valen zero.
Problema 12.4 Programeu una seqüència de no més de 6 instruccions que posi a 0 el bit \(i\)-èsim del registre t1, deixant la resta de bits intactes. Suposeu que \(i\) està guardat a t2. Podeu usar altres registres per a resultats temporals.
Problema 12.5 Feu un programa que faci els desplaçaments següents sobre un nombre de 64 bits guardat als registres t2 (32 bits de més pes) i t1 (32 bits de menys pes):
- Desplaçament a l’esquerra d’1 posició.
- Desplaçament lògic a la dreta d’1 posició.
- Desplaçament aritmètic a la dreta d’1 posició.
- Desplaçament lògic a l’esquerra de \(n\) posicions (\(n < 32\)), on \(n\) ocupa
t3. - Desplaçament lògic a la dreta de \(n\) posicions (\(n < 32\)), on \(n\) ocupa
t3.
Problema 12.6 Suposeu que el registre t0 conté dos enters de 16 bits en complement a 2: un als 16 bits de més pes i un altre als 16 bits de menys pes. Escriviu una seqüència d’instruccions que extregui aquests dos nombres, els representi en 32 bits estenent el signe, i els guardi a t1 i t2 respectivament, sense usar cap instrucció d’accés a memòria.
Problema 12.7 Feu un programa que compti el nombre de bits actius que hi ha al registre t1, executant el mínim d’instruccions possible i sense fer cap lectura de memòria. El resultat s’ha de deixar al registre t3.
Problema 12.8 Escriviu un fragment de codi assemblador RISC-V que intercanviï tots els bits parells amb els bits senars del registre t0.
Problema 12.9 Representeu el valor inicial de cada bit de t4 amb una lletra: el bit 31 és b31, el bit 30 és b30, …, el bit 0 és b0. Cada lletra denota un valor binari desconegut (0 o 1).
- Escriviu les instruccions necessàries perquè el bit de més pes passi a ser el de menys pes i la resta de bits es desplacin una posició cap a l’esquerra.
- Seguint la mateixa notació, escriviu el contingut del registre
t4després d’executar les instruccions del Codi 12.1:
12.2 Sentències condicionals i bucles
Vegeu Secció 3.6 i Secció 3.7.
Problema 12.10 Traduïu a assemblador RISC-V el programa en C del Codi 12.2, suposant que a, b i c ja s’han inicialitzat als registres t1, t2 i t3:
Problema 12.11 Traduïu a assemblador RISC-V la sentència if del programa en C del Codi 12.3, que converteix un dígit hexadecimal (representat per un caràcter ASCII guardat a la variable global c) al seu valor binari equivalent i l’escriu a la variable global num (enter de 8 bits). Suposeu que el valor de c és un dels caràcters {'0'..'9', 'A'..'F', 'a'..'f'}.
Problema 12.12 Traduïu a assemblador RISC-V la sentència switch del Codi 12.4. La variable op ocupa el registre t0 i les variables a, b, res ocupen t1, t2, t3:
switch amb quatre casos i default.
Proposeu dues implementacions: una amb salts encadenats i una altra amb taula de salts (jump table). Quan és preferible cada enfocament?
Problema 12.13 Donat el programa en C:
C
- Traduïu-lo a assemblador RISC-V.
- Quin és el nombre total d’instruccions que s’executen?
- Suposant un processador a 2 GHz on totes les instruccions tenen CPI = 2, si el nombre d’instruccions executades fos 10, quants segons trigaria a executar-se el programa?
- En un processador a 2 GHz, si el nombre d’instruccions executades fos 10, com a l’apartat c), i el programa trigués \(5 \times 10^{-9}\) s, quin seria el CPI del programa?
Problema 12.14 Donades dues variables enteres a i b (amb b ≥ 0), ja inicialitzades als registres t1 i t2:
- Programeu en C una seqüència d’instruccions que multipliqui
a * busant un buclewhilei operacions de suma. El resultat s’ha de deixar ac, ubicada al registret3. - Traduïu-la a assemblador RISC-V.
- Quin és el nombre màxim d’instruccions RISC-V que poden arribar a executar-se?
- En un processador a 2 GHz on totes les instruccions usen 2 cicles de rellotge, quants segons trigaria a executar-se el programa?
- Si en comptes de sumes s’usa una única instrucció de multiplicació que utilitza 10 cicles de rellotge, quants segons trigaria a executar-se? Quin seria el CPI del programa?
Problema 12.15 Traduïu a assemblador RISC-V el programa en C del Codi 12.5:
Problema 12.16 Traduïu a assemblador RISC-V el programa en C del Codi 12.6, suposant que les variables globals ja s’han inicialitzat:
Problema 12.17 Donada la variable global (on N és una constant):
Calculeu el temps d’execució en cicles de rellotge de cada versió del programa que suma els elements de v, suposant que:
- Els accessos a memòria triguen 4 cicles.
- Els salts que no salten triguen 1 cicle.
- Els salts que salten triguen 2 cicles.
- La resta d’instruccions triguen 1 cicle.
RV32I
RV32I
RV32I
RV32I
RV32I
- Programeu una nova versió de l’apartat e) que en disminueixi el temps d’execució.
Problema 12.18 Donada la declaració en C (on N és una constant):
Escriviu un fragment de codi assemblador RISC-V que intercanviï cada element d’índex parell amb l’element següent d’índex senar.
Problema 12.19 Donades les declaracions:
RV32I
Cada vector conté caràcters ASCII que representen dígits numèrics. En conjunt, cada vector representa un natural decimal amb les unitats a l’última posició. Escriviu un programa que sumi els naturals representats per v1 i v2 i deixi el resultat a v3, que té un dígit de més per poder representar qualsevol suma sense desbordament. Feu servir l’algorisme típic de la suma dígit a dígit.
12.3 Subrutines: introducció
Vegeu Secció 3.9.
Problema 12.21 Escriviu en C i en assemblador RISC-V una funció que, donats dos enters de 32 bits passats per valor, retorni el mínim dels dos.
Problema 12.22 Traduïu a assemblador RISC-V la subrutina en C del Codi 12.7:
Problema 12.23 Donat el fragment de programa en C:
C
Sabent que vect1 i vect2 són variables globals:
- Traduïu a assemblador RISC-V la funció
main. - Traduïu a assemblador RISC-V la subrutina
examen.
Problema 12.24 Donades les declaracions en C:
- Traduïu a assemblador RISC-V el fragment de codi del Codi 12.8, que pertany a
exam, suposant queiipocupent0it1:
- Traduïu a assemblador RISC-V la sentència condicional del Codi 12.9, que pertany a
exam, suposant queiocupat0:
- Traduïu a assemblador RISC-V el fragment de codi del Codi 12.10, que pertany a
exam, suposant queiipocupent0it1:
Problema 12.25 Donades les funcions en C:
C
- Traduïu a assemblador RISC-V la subrutina
swap. - Traduïu a assemblador RISC-V la subrutina
examen.
Problema 12.26 Sabent que la funció f té la capçalera en C:
i que la seva traducció a assemblador RISC-V és el Codi 12.11:
f.
- Quin valor retorna
fper an = 0x6789ABCD? - Expliqueu amb paraules què calcula la funció
f.
Problema 12.27 Traduïu a assemblador RISC-V la funció recursiva del Codi 12.12:
Problema 12.28 Traduïu a assemblador RISC-V la subrutina en C del Codi 12.13:
Problema 12.29 Traduïu a assemblador RISC-V la funció func1:
Problema 12.30 El repertori de RISC-V inclou la instrucció jalr per cridar subrutines i per a salts indirectes. Suposeu que s’executa el fragment de codi RISC-V del Codi 12.14:
Quina és la resposta correcta?
- La instrucció
jalrs’executa 1 vegada. - La instrucció
jalrs’executa 2 vegades. - La instrucció
jalrs’executa 3 vegades. - La instrucció
jalrs’executa infinites vegades (el programa entra en un bucle infinit). - Sense saber el contingut d’altres posicions de memòria no es pot saber quantes vegades s’executa.
12.4 Subrutines: context i bloc d’activació
Vegeu Secció 3.9.3 i Secció 3.9.4.
Problema 12.32 Donades les declaracions en C:
C
Traduïu a assemblador RISC-V la funció subr1.
Problema 12.33 Donades les declaracions de variables globals i de la funció A:
C
- Traduïu a assemblador RISC-V la sentència:
- Dibuixeu el bloc d’activació d’una crida a la funció
A. - Traduïu a assemblador RISC-V la funció
A.
Problema 12.34 Traduïu a assemblador RISC-V la funció A:
12.5 Compilació, assemblatge, enllaçament i càrrega
Vegeu Secció 3.10.
Problema 12.36 La pseudoinstrucció la rd, symbol s’expandeix habitualment en dues instruccions reals. Expliqueu quines són i per què són necessàries dues instruccions. Quina és la limitació en el desplaçament que pot representar l’expansió?
Problema 12.37 Un projecte té dos fitxers font:
- Quines fases del flux de generació (compilació, assemblatge, enllaçament) intervenen en construir l’executable?
- El fitxer objecte
b.oconté una referència externa axi af. Qui resol aquestes referències i en quin moment? - Si
xes declarastatic int x = 42aa.c, canvia alguna cosa? Per què? - La pseudoinstrucció
la t0, xes tradueix enauipc+addi(Problema 12.36). Per quèauipc, relatiu al PC, i nolui, que carrega una adreça absoluta?