視頻:
如果本次課程對應(yīng)的 Coursera 的視頻打不開权薯,可以點擊下面鏈接
P1W6U6.6A -Project-6-Overview Programming
軟件:
全課程所需軟件項目包官方下載:
https://www.nand2tetris.org/software
備了一份軟件項目包放在CSDN了,版本2.6支持Mac、Linux蕉汪、Windows:
https://download.csdn.net/download/shazizm/11268147
U6.6A 是用編程方式來實現(xiàn) 匯編器流译,這節(jié)課老師會講解很多實際編程時的問題,以及提供的工具和測試文件肤无。
如果對編程一點不了解先蒋,那么U6.6B就是講解如何“人肉”充當(dāng)編譯器,來告訴我們?nèi)绾稳斯しg匯編語言宛渐。
不過即使如此竞漾,還是建議聽聽U6.6A。另外如果計劃繼續(xù)開展part2軟件部分的學(xué)習(xí)窥翩,自己寫一個匯編器還是蠻有用的业岁,貌似之后的學(xué)習(xí)中,程序會很長寇蚊,人工實在是不太可能完成笔时,且容易出錯。
Hack Assembler
課程給Hack的匯編器起的名字就叫 HackAssembler
它能把一個后綴是 .asm 的匯編程序文件仗岸,翻譯后允耿,輸出一個后綴是 .hack 的二進制內(nèi)容的文件。
另外編譯器不會去檢查匯編程序語法是否正確扒怖,默認假設(shè)接收的 xxx.asm 都是沒有語法錯誤的 较锡,所以我們寫匯編程序時不要寫錯。
假如你的匯編器是用java寫成的盗痒。那么運行程序的樣子就是下圖prompt后面的樣子蚂蕴。
在一個命名行(終端)里輸入:
java HackAssember Xxx.asm
建議的軟件模塊
軟件架構(gòu)在上節(jié)課里已經(jīng)講過俯邓。這里明確給出了建議的模塊名稱骡楼。
比如我就假設(shè) Parser 和 Code 是java里兩個類,SymbolTable可以是一個java里的鍵值表稽鞭,最后Main主程序來組織整個翻譯流程鸟整。
Parser
Code
SymbolTable
Main
建議的實施步驟
老師建議化繁為簡吃嘿,可以分兩塊一步一步來。
比如第一步先做一個能翻譯 無符號的匯編程序 的匯編器梦重。
第二步在單獨做一個處理 符號的程序兑燥。
最后把兩部分融合起來。
還提供了兩套測試用的匯編程序琴拧。帶L的就是無符號的匯編程序
接下來挑幾個分別講講
Add.asm 測試程序
這個程序很簡單降瞳,主要是就是測試如何處理 空行 和 注釋
當(dāng)然 翻譯指令無符號指令也是最基本的。
Max.asm 挣饥、Rectangle.asm測試程序
Max.asm 這是一個比兩個數(shù)大小的匯編程序除师,當(dāng)然匯編器并不關(guān)心這個。它只是根據(jù)語法逐行翻譯就是了扔枫。
Rectangle.asm 是一個畫方框的程序汛聚。
同樣都分別提供了 有符號 和 無符號兩種版本。
Pong.asm 測試程序短荐。
Pong 是一個小游戲倚舀。一個彈來彈去的球,玩家控制一個板不讓它掉下去忍宋。
老師用CPU Emulator仿真器痕貌,加載了Pong.asm,然后運行了程序糠排,演示這個小游戲舵稠。
這個就是一個大點的程序了,如下圖入宦,但這個游戲的邏輯如果用高級語言寫哺徊,大概就是200多行。有這么多行匯編指令乾闰,這里實際上不光有Pong游戲的邏輯落追,還有一個小型的操作系統(tǒng),來控制屏幕汹忠、鍵盤淋硝、計算等雹熬。
這個Pong.asm 是part2部分的老師發(fā)明的Jack高級語言通過老師發(fā)明的 JackCompiler編譯器宽菜,編譯出來的,總之這都是part2的東西了竿报,也都是part2中我們要去自己實現(xiàn)的東西铅乡,期待。
還好烈菌,在這里我們只是拿來Pong.asm測試我們的匯編器阵幸,不用關(guān)心它怎么來的。芽世。挚赊。
演示視頻從 12:55 到 21:50
老師沒忍住济瓢,還是提了一下這個小游戲的背后荠割,是我們part2要學(xué)習(xí)并實現(xiàn)的
Jack 類似java的面向?qū)ο蟮母呒壵Z言
Jack編譯器
JackOS 操作系統(tǒng)
因為Jack編譯器編譯出來的匯編語言。所以自然沒有 空行 和 過多的注釋。
驗證測試結(jié)果
老師在軟件包里夺克,提供了三種工具,可以對比驗證我們的結(jié)果嚎朽。
把匯編器翻譯后的 xxx.hack 文件加載到下面任意工具中铺纽,進行結(jié)果驗證
Hardware simulator
CPU Emulator
Assembler
例如下圖 Assembler 使用示意圖