# CA-2019Fall: Quiz 3
## `A`
You are given the following C code along with an incomplete translation of this code into RISC-V assembly. Assume that execution ends when it reaches the `unimp` instruction. (`unimp` means "unimplmented")
![](https://i.imgur.com/KD9M00Q.png)
Complete the RISC-V translation by:
1. Inserting the loop label where it belongs in the code.
2. Filling in the blank box with the missing instruction.
## `B`: continuing `A`
Provide the values left in the registers below following the execution of the
corrected code:
Value left in t0: `0x____________`
Value left in t1: `0x____________`
Value left in a2: `0x____________`
---
## `C`
For each RISC-V instruction sequence below, provide the hex values of the specified registers after each sequence has been executed. Assume that all registers are initialized to 0 prior to each instruction sequence. Each instruction sequence begins with the line (`.` = `0x0`) which indicates that the first instruction of each sequence is at address 0. Assume that each sequence execution ends when it reaches the `unimp` instruction.
![](https://i.imgur.com/SyILCjS.png)
---
## `D`
Assume that these memory locations have been initialized with the following data. The data consists of 3 words beginning at address 0x100, another 3 beginning at address 0x200, and finally a third set beginning at address 0x1000.
![](https://i.imgur.com/6DchtbO.png)
![](https://i.imgur.com/yHLrev7.png)
---
## `E`
Below is the C code for a recursive version of the factorial function. And then following a translation to RISC-V assembly language.
- [ ] C code
```cpp
int mul(int a, int b) {
return a * b;
}
int factorial(int n) {
if (n <= 1) return 1;
int f1 = factorial(n - 1);
return mul(f1, n);
}
```
- [ ] RISC-C Assembly
![](https://i.imgur.com/6r236zx.png)
`(1)` What should be in the blank on the line labeled L1 to make the function operate
correctly?
L1: lw `____________`
`(2)` How many words will be written to the stack before the program makes each recursive call to the factorial function?
Number of words pushed onto stack before each recursive call? `__________`
The factorial code above and a program that calls it once (using `call factorial` and with an argument greater than `1`) are loaded into the RISC-V simulator. A breakpoint is set on the line labeled L2 and the program is executed until it reaches the breakpoint. The diagram below shows a small piece of the stack at this point. All addresses and data values are shown in hex. The current value in the SP register is `0xF7D8` and points to the location shown in the diagram.
`(3)` Fill in each of the blanks to the right of the diagram to indicate which register the value came from when it was pushed onto the stack. Write an `X` if it is not possible to determine from the information you have
![](https://i.imgur.com/AOAISNy.png)
---
==Solutions==
## A
```
loop:
slli t0,t0,2
```
## B
* t0: 0x808
* t1: 0x4
* t2: 0x2
## C
* x2: 0x2000
* x3: 0x2009
* x4: 0xFFFFDFF6
## D
* x6: 0x12345678
* x7: 0x100
* x8: 0x77773333
## E
* (1) ra, 0(sp)
* (2) 2
* (3)
* 0x2: X(impossible)
* 0x80: ra
* 0x2: a0