Nand to Tetris - 6

Introduction

Assembler:将machine language(asm)翻译成电脑可以懂的二进制指令文件。

指令分类

  • A指令 @R1 选一个目标地址
  • C指令 dest = comp ; jump
    1. 计算的结果放到dest
    2. 根据comp,jump到目标地址
  • Label 把一个位置标记后,方便跳转。 先整体扫描每一条指令对应行号,label不占行号,知道label对应的行号8之后,@label就相当于@8

Architecture

architeture

Python

  • 读取文件内容
    • 手动打开和关闭
    • 使用后自动关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 手动打开文件
file = open('filename.txt', 'r')

# 读取文件内容,整个内容,小文件
content = file.read()

# 打印内容
print(content)

# 关闭文件,文件资源被释放
file.close()

# 打开文件并读取整个内容
with open('filename.txt', 'r') as file:
content = file.read()

# 打印文件内容
print(content)

# 打开文件并逐行读取
with open('filename.txt', 'r') as file:
for line in file:
print(line.strip()) # 逐行处理文件内容
  • 把这个脚本改为通过命令行参数运行: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/
作者
Wynn
发布于
2024年9月3日
许可协议