# HW3 DEMO 指南
僅僅列出一定要通過的標準,可以看情況增加。
## General
- 請學生編譯自己的HW3
- 請先移除舊的執行檔
- 查看是否有warning message
- 簡單的查看步驟
- `./codegen test1.c -> *.s`
- 請學生自行編譯,我們沒有限定方法
- `gcc *.s -> *.out`
- `objdump -dC a.out > a.dump`
- `grep -rni "main" a.dump`
- 查看main從哪裡開始
- `spike -d pk a.out`
- `until pc 0 main_addres`
- 執行到最後一個 add,可以請學生找
- `reg 0`
- 查看reg裡面的值是否吻合。
## Rank D
- 程式是屍體
- 請他們解釋失敗的理由
- 無法通過編譯 -> 從錯誤訊息問
- 可以動但無法通過 Rank C 測試
- 哪些狀況可以通過
- 哪些狀況不行通過
## RANK C
- 過 test1.c 即可
- 使用 debug mode 查看最後一個 ADD 以確認數值是否正確
```c
int main() {
int a = 4;
int b = 3;
int c = a + b;
int d = a + b * c;
int e = a / c + c;
// printf("%d %d %d %d %d\n", a, b, c, d, e);
// 4 3 7 25 7
a = b + b - b * -c * d / c;
b = a * b + c - e;
c = a + b;
// printf("%d %d %d %d %d\n", a, b, c, d, e);
// 81 243 324 25 7
return 0;
}
```
> 這裡埋了一個伏筆,因為 assembly 能可以直接使用的常數是有上限的。(這個常數會直接寫在指令上面)
> 所以當超過這個上限的時候,這個常數就要自己重新組合出來
> 倘若沒有處理的話會吃一個來自 assembler 的錯誤訊息,`invalid operand`。
- 問題集
- 怎麼處理常數
- 怎麼處理變數
- 怎麼存放變數於記憶體
## RANK B
```c
// Testcase2
// if case, just example
int main() {
int a = 2000;
if (a != 0)
{
int b = 4000;
int c = 2000;
a = (b * 2 + c)/2;
}
return 0;
}
```
```c
// Testcase3
// if else case, just example
int main() {
int a = 2000;
if (!a)
{
int b = 4000;
int c = 2000;
a = (b * 2 + c)/2;
}
else
{
}
return 0;
}
```
```c
// Testcase4
// while case, just example
int main() {
int a = 1;
while(a < 10)
{
int b = 0;
b = a * 1000;
a=a+1;
}
return 0;
}
```
- 重點
- 查看Branch的結構是否吻合
## RANK A
從這裡開始都是隱藏測資。
考察重點
- 是某吻合Calling conventaion 需求
```c
// Testcase5
int foo(int a) {
return a+1;
}
int main() {
int b = 123;
b = foo(b);
b = b+320; // shall be 123+1+320=444
return 0;
}
```
```c
int gcd(int a, int b) {
if(b == 0) {
return a;
} else {
while((a-b) > b) {
a = a - b;
}
return gcd(b, a);
}
}
int main() {
int a = 555;
int b = 777;
int c = gcd(a, b);
c = c * 5; // C = 555;
return 0;
}
```
```c
int fib(int a) {
if(a < 0) {
return -1;
}
if(a == 0 || a == 1) {
return 1;
} else {
return fib(a-1) + fib(a-2);
}
}
int main() {
int a = 5555555; // Maybe invalid oprand
int b = a / 1000000;
int c = 0;
c = fib(b)+fib(c);
return 0;
}
```
```c
// Check array
int main() {
int b;
int c;
int a[123];
b = 123;
while(b != 0) {
b = b - 1;
a[b] = b;
}
a[4] = a[4] + 1;
return 0;
}
```
```c
// Check array init
int main() {
int a[4] = {1, 2, 3, 4};
a[3] = a[3] + 1;
return 0;
}
```
## RANK S (or SSS)
請學生解釋,他的RA可以作用的case。
重新使用上面的 `test1.c`,檢查即可。