視頻:
如果本次課程對應的 Coursera 的視頻打不開航邢,可以點擊下面鏈接
P1W6U6.5 -Developing a Hack Assembler-Proposed Software Architacture
經(jīng)過上節(jié)課的講解耕赘,基本上如果已經(jīng)掌握一門高級編程語言的你,就可以開始根據(jù)上幾節(jié)課的邏輯開始編寫匯編器了膳殷。也可以跳過這節(jié)課操骡。
如果編過一些程序,但是掌握不熟赚窃,或者之前課聽的邏輯不清册招,是最適合看這節(jié)課的。
但如果你沒聽說過類啊勒极、構造行數(shù)啊是掰、方法啊這些面向對象編程概念的話。那聽這節(jié)課之前辱匿,應該簡單了解一下這些概念键痛,比如找些java的學習資料看一看。
需要分三步
一匾七、分析文件(Parser)
二絮短、翻譯指令(Code)
三、處理符號(Symbol Table)
一昨忆、分析文件(Parser)
Parser 來處理第一步丁频。老師暗示它應該編寫成一個類。
第一步又被分成3小部分來分別講解。
1席里、通過一個文件名叔磷,讀取一個文件
Parser 類,通過構造函數(shù)的參數(shù)胁勺,引入文件名
然后執(zhí)行讀取文件
2世澜、可以順序讀取每一行指令
這里編程時,老師暗示也許會需要下面一些方法署穗。
還有指令否寥裂? boolean hasMoreCommands();
獲取下一行指令 void advance();
一次讀一行
需要跳過忽略行
3、區(qū) 分 指令
需要區(qū)別:
A指令
C指令
Labels
需要分拆:
例如A指令 需要拆分 @ 和后面的部分
例如C指令 需要分成 dest案疲、comp封恰、jump 三個字符串部分,例如下圖底部代碼示意褐啡,通過對應的三種方法獲得拆分后的字符串诺舔。
二、Code
A指令處理和C指令是一樣的备畦,C指令略復雜低飒,這里老師拿出C指令,具體講解了一下懂盐。
C指令拆分后褥赊,每一部分都有一個老師之前給出的表,可以對照來翻譯莉恼。
下圖老師給出了一個示意代碼拌喉,明顯其中類(Parser、Code)的方法(comp俐银、dest尿背、jump)需要我們根據(jù)對照表自己去實現(xiàn)。
三捶惜、符號表
符號表是匯編器用來在翻譯過程中田藐, 維護、處理符號的售躁。而符號的使用坞淮,是為了給人們寫匯編程序提供更大的便利和更高的效率。
1陪捷、符號表 The Symbol Table
一開始程序初始化的時候需要創(chuàng)建一個空的鍵值表。
需要實現(xiàn)以下方法:
增加鍵值
查詢鍵是否存在
通過鍵诺擅,獲取值
2市袖、如何使用 符號表
初始化符號表后,先把 pre-defined 的符號,寫入表內(nèi)苍碟,例如SCREEN酒觅、R0~R15等。
first pass時微峰, 通過()找到labels舷丹,寫入符號表,注意label對應的值需要維護一個指令地址蜓肆。
second pass時颜凯, @后面的符號 如果不在表里,那一定就是variables了(因為@后面還會跟labels仗扬,但是labels已經(jīng)在 first pass時症概,寫入表里了),對應值從16開始早芭,例如第一個新variable對應16彼城。
這樣就把三種符號都處理到表中了
編程邏輯 最終匯總
初始化:Parser 和 Symbol表
第一遍掃描:取出忽略的行,讀出全部指令退个,另外找出labels寫入符號表
第二遍掃描:翻譯(翻譯的邏輯看下圖Main Loop募壕,基本上面都提到了)
下節(jié)課 U6.6A
如果用高級語言編寫匯編器的話,老師提供了一些方法和建議语盈,另外一些測試材料舱馅,還提到了part2的一些內(nèi)容。
下下節(jié)課 U6.6B
如果你不想編程黎烈。那么這節(jié)課很適合你习柠,老師教你如何化身“人肉匯編器”。