sysprog2017
dev_record
contributed by <HTYISABUG
>
在開始使用之前, 需要先瞭解指令集
在 README.md
中有列出一部份指令的 opcode 以及用途,
但閱讀 tests
資料夾中的範例程式碼時發現有些指令未被列出
在 opcode.def
中找到了所有可用指令的列表
這份檔案中定義了指令的 opcode 與 prototype
為了加快編程速度, 先將各版本用 C 寫一遍
再利用老師在你所不知道的 C 語言:編譯器和最佳化原理篇中提到的
GCC 編譯參數 -fdump-tree-cfg=
輸出 Basic Block
最後再轉換為模擬器可用的組合語言
應該提及詳細資訊,如何從 3-address code 轉換,又如何寫出給定 ISA 的組合語言程式
jserv
注意合理的輸入數值範圍
jserv
vm_value
vm_operand
vm_inst
vm_opcode_impl
_vm_env
中用到vm_handler
的陣列來取代vm_handler
<- void (*) (VM_HANDLER_ARGS)
DISPATCH
BEGIN_OPCODES
computed goto
以陣列管理 labelvm_run
HANDLER
OPCODE
所傳回的型別中實際上也沒有 handler
這個 member請提交 pull request 來修正
"jserv"
加入命令列參數 -i
設定預設數值
在初始化虛擬環境後, 加入是否使用預設參數的判斷
設定實作
為了辨認各個標籤所指向的位址, 在虛擬環境 vm_env
中追加一個 label-address 表
在進行組譯之前先將所有程式碼掃過一遍, 提取 label
將 label 做 hash 並對表格大小取 mod 存入表格
在組譯時, 如果遇到標籤就將其去除
如果標籤為獨立一行, 會在這一行插入 OP_NOP
以便標記位址
標籤去除後組譯行為與原本相同
最後在 make_operand
時, 如果收到的字串能在表格內搜索到
則將字串轉換成對應的位址作為 operand
如此一來 vm_env
就支援 label 了
之前的 fib-iterative 可以改寫成
不用再算那些行號了
寫完這段後去看了其他人的共筆
發現其他人都用其他 prefix 當作辨識符
HTYISABUG
do{} while(0);
是為了避免單行 if 沒加大括弧造成巨集不完整的手法(參考此處) <- dangling else
HMKRL