Since the translation from mnemonics and symbols to binary code is straightforward, it makes sense to write low-level programs directly in symbolic notation and have a computer program translate them into binary code.
汇编器将汇编语言翻译成机器码,让人们免于直接通过机器码控制计算机。
汇编器的原理,在完成前五章之后,已显得较为清晰。汇编器的翻译过程实际上可以通过纸笔,以人工方式完成。如何将这个过程设计成程序,让计算机来实现,是本章的要点。
本章通过高级语言设计汇编器。理论上编译器和汇编器都可以由外部人工翻译替代,故使用高级语言并没有破坏设计的自洽性。
除了对指令符号的映射和注释功能外,汇编器的一个重要功能是对自定义符号的支持。
汇编代码允许将程序中一行的位置定义为一个符号(label),也可以将数据内存的一个位置定义为符号(variable),这实际都是内存地址值到符号的映射。
符号的功能是通过汇编器中的符号表实现的。符号提高了可读性,降低了开发难度。
这也直观地展示了内存中的栈区是如何在编译时被分配的。堆区的动态内存分配则会在后续的OS部分中实现。
汇编语言允许标签在定义前被使用。为实现此功能,汇编器可以先读一遍程序,将标签加入符号表,再读第二遍,将程序翻译为机器码。
假设提供的汇编程序均无语法错误,使用任意高级语言实现汇编器。
除了逐行的汇编翻译外,汇编器还可以添加对微语句的支持,即允许用一条汇编语句表达多行机器码。
编译器通常也可以将高级语言翻译为汇编代码,为程序提供硬件平台级别的设计优化。
提供的汇编器有个使用教程。
本质是设计一个文本处理程序。在CS50x基础上,C和Python都是可选项。考虑到C语法、编译和库都比较复杂,选择用Python实现。
Python提供的功能较完善,不需要按书中建议的API方式实现。
字典的初始化有点折磨,可以考虑直接复制粘贴。
CS50x没教面向对象,故仅用面向过程。假设输入的程序符合语法规则,此时汇编器代码不算复杂。
注意pong程序中出现了'MD'符号,应当是不符合语法的。但可以合理地模糊匹配为'DM'并通过测试。