---
tags: sysprog2017
---
# 2017q3 Homework3 (simulator)
contributed by <`Yuessiah`>
<!-- ###### 本文件多處地方採用超連結來補完報告,建議點開來看 -->
## 開發環境
```
eeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeee
eeeee eeeeeeeeeeee eeeee OS: elementary os elementary OS 0.3.2 freya
eeee eeeee eee eeee Kernel: x86_64 Linux 4.4.0-93-generic
eeee eeee eee eeee Shell: bash 4.3.11
eee eee eee eee Virtualization: VT-x
eee eee eee eee CPU: Intel Core i7-7700 CPU @ 4.2GHz
ee eee eeee eeee CPU(s): 8
ee eee eeeee eeeeee
ee eee eeeee eeeee ee RAM: 1691MiB / 15934MiB
eee eeee eeeeee eeeee eee L1d cache: 32K
eee eeeeeeeeee eeeeee eee L1i cache: 32K
eeeeeeeeeeeeeeeeeeeeeeee eeeee L2 cache: 256K
eeeeeeee eeeeeeeeeeee eeee L3 cache: 8192K
eeeee eeeee
eeeeeee eeeeeee BogoMIPS: 7200.65
eeeeeeeeeeeeeeeee
```
## 程式碼閱讀心得
### `as.c` :
`#define` 使用 `do { ... }while(0)` 是為了讓使用此 macro 行為像 function 用法[^1], 不過我覺得若 macro 只有一行指令時這樣用法是顯得有點冗。
function `make_oprend` 及 `make_result` 中多處在 `exit(-1)` 之前執行 `free(line)`, 這是不需要的[^2]。
而且 clang-format 會在 function `assemble_line` 中報 `(error) Deallocating a deallocated pointer: line_backup`
## 加入 label 功能
先將整份文件讀一遍,有出現 label 的地方將行數及 label 字串紀錄到一份表中
接著繼續照先前作法,但當 operand 遇到 label 字串,就從表中將對應的行數賦值給 operand。
詳細看 code。
## Fibonacci 數列
此實做會印出 f(n=6), n 必須大於等於 1
- iterative
```=
add $0 $1 #1 ; set f(1) = 1
add $0 $6 #3 ; for #3 = 6:
add #0 #1 #2 ; store f(n-1) + f(n) to #2
add #1 $0 #0
add #2 $0 #1
sub #3 $1 #3 ; #3 -= 1
jnz #3 #2 ; end for if #3 == 0
print #0
```
- recursive
```=
jmp #14
; if(n == 0):
jnz #2 #3
ret
; if(n == 1):
sub #2 $1 #3
jnz #3 #7
add #6 $1 #6
ret
; f(n-1)
sub #2 $1 #2
call #1
add #2 $1 #2
; f(n-2)
sub #2 $2 #2
call #1
add #2 $2 #2
ret
; call f(n=6)
add $0 $6 #2
call #1
print #6
```
[^1]: [stackoverflow.com/ Why use do { } while \(0\) in macro definition?](https://stackoverflow.com/questions/9495962/why-use-do-while-0-in-macro-definition)
[^2]: [blog.gtwang.org/ C 語言中關於記憶體釋放的議題](https://blog.gtwang.org/programming/memory-deallocation-issues-in-c)