---
# System prepended metadata

title: HW3 DEMO 指南

---

# 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`，檢查即可。