# Computer Architecture HW2
## Part1
### a.

ackermann : 0x010140
result : gp - 2028 = 0x0127B8 - 2028 = 0x011fcc
### b.
因為使用c.lw來讀入資料,寫入的資料大小為1個word,使用bfos來做sign extend,使資料變回2個word(64bits).
### c.

從stackpointer讀出一個x(S0[-36])與y-1(S0[-40])的值,寫入a0和a1以傳入下一個ackermann().(0x010190~0x0101aa)
呼叫兩次ackermann(),先做ackermann(x, y-1)回傳值會存在a0,再把a0存到a1, 從s1中取出之前存的x-1放到a0,做ackermann(x-1, ackermann(x, y-1)).
### d.

經過優化後,在這邊直接從a1和a0中取出x和y,直接用c.addiw把a1放入y-1,而x的值原本就再a0中不需要做其他的處理,直接呼叫ackermann(x, y-1),回傳值放在a0。再把a0獨到a1,從s0中讀出之前的存入stack的x再一次呼叫ackermann(),完成ackermann(x-1, ackermann(x, y-1))。
## Part2
### a.
```assembly
addi x28, x28, 1
slli x28, x28, 2
add x28, x28, x10
lw $r0, 0(x28)
slli x29, x29, 2
add x29, x29, x10
lw $r1, 0(x29)
add $r0, $r1, $r0
addi x11, x11, 32
sw $r0, 0(x11)
```
### b.
```assembly
addi x28, x28, 1
slli x28, x28, 3
add x28, x28, x10
ld $r0, 0(x28)
slli x29, x29, 3
add x29, x29, x10
ld $r1, 0(x29)
add $r0, $r1, $r0
addi x11, x11, 64
sd $r0, 0(x11)
```
## Part3
```assembly
and x5, x5, x6
xori x5, x5, -1
```
## Part4
```c
int i = 100;
int temp = 0;
while(i>0){
result += MemArray[temp];
temp ++;
i --;
}
```
## Part5
二進制 : 1111111 00110 00101 001 10011 1100011
十六進制 : FE6299E3
## Part6
### a.
| | funct7 | rs2 | rs1 | funct3 | rd | opcode |
|:------ | ------ | -------- | -------- | ------ | -------- |:-------- |
| before | 7 bits | 5 bits | 5 bits | 3 bits | 5 bits | 7 bits |
| after | 7 bits | 5+2 bits | 5+2 bits | 3 bits | 5+2 bits | 7+2 bits |
2*3+2 = 8
32 + 8 = 40
增加後一個指令大小為40bits
### b.
| | immediate | rs1 | funct3 | rd | opcode |
| ------ | --------- | -------- | ------ | -------- |:-------- |
| before | 12 bits | 5 bits | 3bits | 5 bits | 7 bits |
| after | 12 bits | 5+2 bits | 3bits | 5+2 bits | 7+2 bits |
2*2 + 2 = 6
32 + 6 = 38
增加後一個指令大小為38bits
### c.
指令種類變多且可用的暫存器變多可以讓複雜的事情用比較少的指令寫,但會讓每一條的指令變得比較大,硬體方面也要做更改。
## Part7
