摘要:今天折騰一上午,終于完成了上這個(gè)課程的最后一個(gè)匯編器項(xiàng)目。這套課程真是沒白跟,收獲良多,現(xiàn)在已經(jīng)等不及想看下一期的軟件部分了,哈哈。
今天折騰一上午,終于 完成了 Coursera 上 From Nand to Tetris / Part I 這個(gè)課程的最后一個(gè)匯編器項(xiàng)目。這套課程真是沒白跟,收獲良多,現(xiàn)在已經(jīng)等不及想看下一期的軟件部分了,哈哈。
下面是我的 python 實(shí)現(xiàn),存?zhèn)€檔,同時(shí)給同樣在看這課程的同學(xué)們參考。
注釋風(fēng)格看起來可能有點(diǎn)奇怪,拍腦袋想的,沒多少 python 編碼經(jīng)驗(yàn),還望包涵,稍微解釋一下:
#-----------------# # 大塊代碼用途描述 # #-----------------# ## 分級注釋 ### 分級注釋 #### 分級注釋
import sys import os.path #--------# # tables # #--------# ## symbol table SYMB_TABLE = { "SP": 0, "LCL": 1, "ARG": 2, "THIS": 3, "THAT": 4, "R0": 0, "R1": 1, "R2": 2, "R3": 3, "R4": 4, "R5": 5, "R6": 6, "R7": 7, "R8": 8, "R9": 9, "R10": 10, "R11": 11, "R12": 12, "R13": 13, "R14": 14, "R15": 15, "SCREEN": 16384, "KBD": 24576 } ## comp table COMP_TABLE = { "0": "0101010", "1": "0111111", "-1": "0111010", "D": "0001100", "A": "0110000", "!D": "0001101", "!A": "0110001", "-D": "0001111", "-A": "0110011", "D+1": "0011111", "A+1": "0110111", "D-1": "0001110", "A-1": "0110010", "D+A": "0000010", "D-A": "0010011", "A-D": "0000111", "D&A": "0000000", "D|A": "0010101", "M": "1110000", "!M": "1110001", "-M": "1110011", "M+1": "1110111", "M-1": "1110010", "D+M": "1000010", "D-M": "1010011", "M-D": "1000111", "D&M": "1000000", "D|M": "1010101" } ## dest table DEST_TABLE = { "null": "000", "M": "001", "D": "010", "MD": "011", "A": "100", "AM": "101", "AD": "110", "AMD": "111" } ## jump table JUMP_TABLE = { "null": "000", "JGT": "001", "JEQ": "010", "JGE": "011", "JLT": "100", "JNE": "101", "JLE": "110", "JMP": "111" } #------------------# # helper functions # #------------------# ## determine is Int def isInt(str): try: int(str) return True except ValueError: return False ## determine instruction type def getInsType(ins): if ins[0] == "@": return "a" return "c" ## split instruction ### instruction A ram_variable_num = 16 def valueOfAIns(ins): global ram_variable_num if SYMB_TABLE.has_key(ins[1:]): ins = SYMB_TABLE[ins[1:]] elif isInt(ins[1:]): ins = ins[1:] else: SYMB_TABLE[ins[1:]] = ram_variable_num ram_variable_num += 1 ins = SYMB_TABLE[ins[1:]] bin_value = bin(int(ins))[2:] zero_count = 16 - len(bin_value) zero_str = "0" * zero_count return zero_str + bin_value ### instruction C def splitCIns(ins): c_parts = {} dest_splited = ins.split("=") if len(dest_splited) == 1: c_parts["dest"] = "null" jump_splited = dest_splited[0].split(";") else: c_parts["dest"] = dest_splited[0] jump_splited = dest_splited[1].split(";") if len(jump_splited) == 1: c_parts["jump"] = "null" else: c_parts["jump"] = jump_splited[1] c_parts["comp"] = jump_splited[0] return c_parts #------------# # main logic # #------------# ## first pass ### source file sf_name = sys.argv[1] sf = open(sf_name, "r") ### destination file df_name = os.path.splitext(sf_name)[0] + ".tmp" df = open(df_name, "w") line_num = 0 for ins in sf: # comment ins = ins.split("http://")[0] # white space ins = ins.strip() if len(ins) == 0: continue # label if ins[0] == "(" and ins[-1] == ")": SYMB_TABLE[ins[1:-1]] = line_num continue df.write(ins + " ") line_num += 1 sf.close() df.close() ## second pass ### source file sf_name = os.path.splitext(sf_name)[0] + ".tmp" sf = open(sf_name, "r") ### destination file df_name = os.path.splitext(sf_name)[0] + ".hack" df = open(df_name, "w") for ins in sf: ins = ins.strip() ins_type = getInsType(ins) if ins_type == "a": val = valueOfAIns(ins) + " " df.write(val) elif ins_type == "c": parts = splitCIns(ins) val = "111" + COMP_TABLE[parts["comp"]] + DEST_TABLE[parts["dest"]] + JUMP_TABLE[parts["jump"]] + " " df.write(val) sf.close() df.close()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45370.html
摘要:第章虛擬機(jī)項(xiàng)目實(shí)現(xiàn)為防閑逛至此的看官不知所云是一個(gè)在線課程,目標(biāo)是指導(dǎo)學(xué)生從邏輯門開始從頭到尾完成一整套計(jì)算機(jī)系統(tǒng)。好像擼串一樣的爽快芯片硬件編譯原理操作系統(tǒng)應(yīng)用程序這里提供的是第八章的作業(yè),以供半路摔進(jìn)坑里的同學(xué)們扶一下。。。 [From Nand to Tetris] 第8章 虛擬機(jī)項(xiàng)目 python 實(shí)現(xiàn) 為防閑逛至此的看官不知所云: From Nand to Tetris 是一...
摘要:從全局來看,大多數(shù)計(jì)算機(jī)只是傳遞一堆布爾值,所以任何對布爾值友好的語言都可以完成這項(xiàng)工作。將模式應(yīng)用于這些布爾值能夠幫助程序員獲得其含義,任何人都要做的最大決策是確定系統(tǒng)將使用哪種字節(jié)順序,并確保所有組件都以正確的順序在總線之間傳遞信息。芯片的設(shè)計(jì)到底有多難?想要回答這個(gè)問題最好還是先自己實(shí)踐一下。最近,來自 BBC 的一名資深軟件工程師 Daniel Harper 使用 Go 語言成功模擬...
摘要:從全局來看,大多數(shù)計(jì)算機(jī)只是傳遞一堆布爾值,所以任何對布爾值友好的語言都可以完成這項(xiàng)工作。將模式應(yīng)用于這些布爾值能夠幫助程序員獲得其含義,任何人都要做的最大決策是確定系統(tǒng)將使用哪種字節(jié)順序,并確保所有組件都以正確的順序在總線之間傳遞信息。芯片的設(shè)計(jì)到底有多難?想要回答這個(gè)問題最好還是先自己實(shí)踐一下。最近,來自 BBC 的一名資深軟件工程師 Daniel Harper 使用 Go 語言成功模擬...
摘要:作用是將標(biāo)準(zhǔn)輸入中的所有大寫字母轉(zhuǎn)換為響應(yīng)的小寫字母。的移植過的源代碼是在源代碼目錄下編譯的,所以源代碼目錄等于目標(biāo)文件目錄,所以條件不滿足,將執(zhí)行分支的代碼。 ????????一個(gè)嵌入式產(chǎn)品的開發(fā)階段,需要不斷地把bootloader下載到存儲器中,如果存儲器使用nand flash,但是...
閱讀 1443·2021-11-22 13:54
閱讀 4325·2021-09-22 15:56
閱讀 1815·2021-09-03 10:30
閱讀 1318·2021-09-03 10:30
閱讀 2086·2019-08-30 15:55
閱讀 1851·2019-08-30 14:13
閱讀 2059·2019-08-29 15:19
閱讀 2341·2019-08-28 18:13