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