# 系統程式 VMCS 虛擬機 本專案研究自 VMCS.pdf 再加上自己的理解 B32register 初步架構 ![](https://hackmd.io/_uploads/SkuuzfcSh.png) ### mnemonic(註記詞) 1.LDA (load A register) 顧名思義就是把值載入到A暫存器裡 addressing modes (定址模式) 決定暫存器如何獲得所需的值 從operand裡取出的數據為2byte (1byte mnemonic 1byte data) 註記符 $01 2.LDX (load X register) 跟 LDA 很像,都是從operand將值載入暫存器中,兩者最大的差別為大小,一個為16一個為8,所以長度為3byte(1byte mnemonic 2byte data) 註記符 $02 3.STA (store A register) 將A裡面的值存入到64k的memory裡面 註記符 $03 4.END 為結束 註記符 $04 ![](https://hackmd.io/_uploads/Sywauz5S2.png) (#)的功能為標記,告訴組譯器要用哪一個值 ($)告訴組譯器為16進制 架構 ![](https://hackmd.io/_uploads/rJsx9fqBn.png) ### B32 Assembler [Optional Label:] <white space><mnemonic><white space><operand>[Optional white space]<newline> #### Example ![](https://hackmd.io/_uploads/HysoMQqHn.png) 首先將英文數字A(asc code)載入A暫存器,然後將$A000也載入到X暫存器,B32的video memeory 也是從$A000開始,從而定義這個function。 之後將A的值存入被X指向的目的地,最後就是end。 --- ### 開始 使用者介面 ![](https://hackmd.io/_uploads/SyKZnQcSh.png) --- 可以選擇檔案 ![](https://hackmd.io/_uploads/S1kgpm9Hh.png) --- 所需函示 ![](https://hackmd.io/_uploads/SkxKNV9S3.png) --- 設定初始值 ![](https://hackmd.io/_uploads/H1UiEN9Bn.png) --- Assemble Btn 的程式碼 ![](https://hackmd.io/_uploads/ByRx8V5H2.png) --- Parse Function 會掃描兩次檔案,第一次掃描label,第二次會掃描並編譯 ![](https://hackmd.io/_uploads/rJpp84qSh.png) --- Label Scan function 用來檢查是label還是mnemonic mnemonic的話前面會有一個空格來做為區別。 如果是label的話,會再根據islabelscan這個 bool 判斷是否要加入到 hash table。掃描完後發現 label 後面沒有值了,就會呼叫 EatWhiteSpace() 這個函式來處理空白的部分。 ![](https://hackmd.io/_uploads/SksidmiSn.png) --- ReadMnemonic function 將對應到的mnemonic 去執行對應的 mncmonic function ![](https://hackmd.io/_uploads/SkLU2Qirn.png) --- LDA function $01 ![](https://hackmd.io/_uploads/SyzS1_jH2.png) --- LDX function $02 ![](https://hackmd.io/_uploads/r1SVGdiSh.png) --- STA function $03 ![](https://hackmd.io/_uploads/S1WGm_orh.png) --- Do end function $04 ![](https://hackmd.io/_uploads/SyV1NujB2.png) --- ReadRegister funciton 這個函示會讀取下一個字元,然後返回一個合適的列舉。基本上就是不論大小寫都回傳同一個 ![](https://hackmd.io/_uploads/ryDkBdjSh.png) --- ReadwordValue function 先檢查有沒有$這個符號,如果有,表示這個值是一個16進制而不是integer。之後再將這個數字的型態轉為unsigned short 在return 回去 ![](https://hackmd.io/_uploads/SyKBSOor3.png) --- ReadByteValue function 跟上面的很像,只是最後轉換得時候是轉換成byte而不是unsigned short ![](https://hackmd.io/_uploads/HkCQDujrn.png) --- EatWhiteSpace function 處理空白的部分 ![](https://hackmd.io/_uploads/HJQdw_iHh.png) --- GetLabelname function ![](https://hackmd.io/_uploads/Hko3DdsS2.png) --- example 經過編碼後的檔案 ![](https://hackmd.io/_uploads/BkxPGtor3.png)