Nand to Tetris - 6
Introduction
Assembler:将machine language(asm)翻译成电脑可以懂的二进制指令文件。
指令分类
- A指令 @R1 选一个目标地址
- C指令 dest = comp ; jump
- 计算的结果放到dest
- 根据comp,jump到目标地址
- Label 把一个位置标记后,方便跳转。 先整体扫描每一条指令对应行号,label不占行号,知道label对应的行号8之后,@label就相当于@8
Architecture
Python
- 读取文件内容
- 手动打开和关闭
- 使用后自动关闭
1 |
|
- 把这个脚本改为通过命令行参数运行:
python Assembler.py Add.asm
- 使用
import sys``sys.argv
获取命令行参数
- 使用
- 主要逻辑封装在
main()
函数- 使用
if __name__ == "__main__":
。这样当脚本被直接运行的时候(i.e.python script.py)
,会调用main()
执行里面的处理流程。__name__
的值将被设置为__main__
- 如果在另一个脚本中导入这个模块(
import script
),main()
里面的内容不会被自动执行。__name__
的值被设置为模块的名称(script
)
- 脚本的执行逻辑和模块功能分开
- 使用
- 当处理label symbol的时候,可能会导致地址计算错误
- 标签本身不占位置,count指令数的时候不算
- 第一遍记录标签行号的时候,计数跳过
- 第二遍解析,只处理
A
C
命令
- 将1001补齐成16位的格式
{0:016b}.format(addr)
0: 表示括号里面第一个参数即addr作为结果,016b表示用0来补充成16位的二进制形式{:0>{}}.format(s, length)
0填充,>右对齐,{}占位符填入长度
Nand to Tetris - 6
https://hexwhat.top/2024/09/03/build-a-computer-6/