iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 21
0
自我挑戰組

資訊工程大補帖系列 第 21

資工補帖-Day 21-系統程式

一、 題目:實作簡易的 Assembler

  1. 請以上課介紹的 SIC 或 SIC/XE 環境為實作對象
  2. 使用語言不拘,如 Assembly, C, C++, Java, VB, C#, Python, …
  3. Instruction set 可參考教科書附錄 A 或自行假設
  4. Assembler之演算法,請參考教科書 Fig. 2.4
  5. 可依上課介紹的內容實作Assembler功能,或者自行假設功能
  6. 測試之輸入資料與格式,自行假設(SIC或SIC/XE program),如教科書Fig.2.1或Fig.2.5
  7. 輸出格式自行假設,如教科書 Fig. 2.2 與Fig. 2.3 或 Fig. 2.6 與 Fig. 2.8
  8. 書面報告務必說明自行假設之細節,依要求格式書寫,並以學號為檔名存成 WORD 檔
  9. 印出作業檔案於 5/5(週五) 上課繳交書面,而檔案上傳於 iLearn2
    二、 開發環境:
  • 開發語言:C / C++
  • 開發平台:Windows 8.1
  • IDE:Dev-c++ 5.11
  • 實作環境:SIC

三、 Instruction set
參考附錄A,本次實作程式用到set如下:
"ADD",0x18,"ADDF",0x58,"AND",0x40,"COMP",0x28,"COMPF",0x88,
"DIV",0x24,"DIVF",0x64,"J",0x3C,"JEQ",0x30,"JGT",0x34,
"JLT",0x38,"JSUB",0x48,"LDA",0x00,"LDB",0x68,"LDCH",0x50,
"LDF",0x70,"LDL",0x08,"LDS",0x6C,"LDT",0x74,"LDX",0x04,
"LPS",0xD0,"MUL",0x20,"MULF",0x60,"OR",0x44,"RD",0xD8,
"RSUB",0x4C,"SSK",0xEC,"STA",0x0C,"STB",0x78,"STCH",0x54,
"STF",0x80,"STI",0xD4,"STL",0x14,"STS",0x7C,"STSW",0xE8,
"STT",0x84,"STX",0x10,"SUB",0x1C,"SUBF",0x5C,"TD",0xE0,
"TIX",0x2C,"WD",0xDC

四、 本次實作程式可執行功能

  1. 將助譯碼轉成opcode
  2. 轉成對應address
  3. 建立機器指令
  4. 轉換常數資料
  5. 產生目的程式

五、 所使用的資料結構

  1. Symbol Table和OP Table使用struct陣列
  2. Symbol Table存放Symbol與Locctr
  3. OP Table存放指令與OP碼 

六、 演算法
參考Fig. 2.4

  1. 第一階段組譯
  1. 第二階段組譯

    七、 輸入資料
    參考課本Fig.2.1
    將以下資料存成input.txt


    八、 輸出資料
    輸出檔案有三個分別為loc.txt、output.txt、objectcode.txt
  2. 參考課本Fig.2.2 LOC欄
    輸出檔名loc.txt
    資料如下

  3. 參考課本Fig.2.2
    輸出檔名output.txt
    資料如下

  4. 參考課本Fig.2.3
    輸出檔名objectcode.txt
    資料如下:


九、 運作方式

  1. 我們將輸入資料(SIC)放入「input.txt」內,並直接執行程式。
  2. 程式若出現組譯完成,於視窗也可直接看到loc.txt、output.txt的內容。
  3. 於資料夾內可查看loc.txt、output.txt、objectcode.txt三個檔案。

十、 實作心得:
本次作業,因為SIC/XE要處理很多字串,就能力問題,還仍然無法完美呈現,故本次作業為實作SIC Assembler。
我們可以從課本當中可以得知組譯SIC的虛擬碼,我利用C語言實現此次的作業,在C語言實作的過程當中,我在實作期間遇到許多問題,如:擷取字串片段、字串轉成整數、整數轉成字串等…問題,經由上網查詢以及與同學討論之後解決這些問題。解決問題的技巧在於於每個不確定的階段進行debug模式,可以查看當前值,以及相關訊息,經由大量測試和修改,可以解決大部分的「排版」問題。
於C語言當中,轉碼問題,為主要遇到的大問題所在,必須時常利用atoi()、itoa()等轉碼函式。檔案輸入以及輸出經由此次的練習之後,已經相當熟練,比如說:fopen()、fprintf()、fclose()等。我認為字串的比較在此次實作也占了很大部分的技巧,strcmp()跟strlen()都是不可或缺的函式,我利用這些函式去處理字串。
而未來若有時間,經由這次的實作經驗之後,想研讀SIC/XE並且實作之,將它設定為目標好好增進自己的實力。因為SIC/XE必須處理定址問題,所以我認為這是很好的訓練自己寫程式的能力。
再者,上網找尋資料的同時,也了解許多以前在計算機概論這門課學習時,無法理解的道理,經由這次的實作也一併理解,覺得此次的實作使得自己的程式能力又提高,但仍不忘繼續向上邁進,期許自己可以靈活使用這些程式語言。


上一篇
資工補帖-Day 20-資訊與網路安全
下一篇
資工補帖-Day 22-Matlab
系列文
資訊工程大補帖30

尚未有邦友留言

立即登入留言