《计算机系统要素》 第六章 汇编编译器

6.1 背景知识

符号化的语言称为汇编,翻译程序称为汇编编译器,汇编编译器对每个汇编命令的所有部分进行解析,将每个部分翻译成它对应的二进制码,并将生成的二进制码汇编成真正能被硬件执行的二进制指令。
编写汇编编译器的复杂性在于:允许汇编程序使用符号来代指内存地址,我们希望汇编器来管理这些用户自定义的符号,将他们解析成物理内存地址,一般采用符号表来完成这个任务。

6.1.1 符号

符号在汇编程序中通常有两个用途:

  • 变量
    程序员可以使用符号的变量名称,编译器会“自动地”为其分配内存地址
  • 标签
    在程序中用符号来标注不同的位置

6.1.2 符号解析

我们首先制定两个任意性规则:

  • 翻译后的代码将被存储到计算机中起始位置为0的内存中
  • 变量将被分配到起始位置为1024的内存中

有三点需要说明:

  • 我们定义的变量分配规则决定了能运行的程序只能有1024条指令,实际的程序(比如操作系统)显然要大很多,因此存储变量的基地址应该设得距离代码存储区更远一些
  • 每条源代码命令映射到一个字的假设过于天真,一般来说,某些汇编命令会被翻译成好几条机器指令,因此它会占据好几个内存单元,为解决此问题,翻译程序会记录每条源代码产生的字的个数,然后相应的更新它的“指令内存计数器”
  • 每个变量用一个单独的内存单元来表示的假设也不切实际,汇编程序支持多种类型的变量,它们在目标计算机上占用不同的内存空间,因此当为变量分配内存空间时,翻译程序必须考虑他们的数据类型和硬件内存单元的宽度

6.1.3 汇编编译器

汇编编译器实际上主要是个文本处理程序,设计目的是用来提供翻译服务,汇编编译器对每个符号命令执行下面的操作:

  • 解析出符号命令所在的域
  • 对于每个域,产生机器语言中相应的位域
  • 用内存单元的数字地址来替换所有的符号引用
  • 将二进制码汇编成完整的机器指令

其中符号处理最为复杂,是汇编编译器的主要功能

python代码实现

Hack汇编代码的四种语法

  • (Xxx)    //标签 --> 第一遍读取阶段将标签放入符号表
  • @Xxx    //Xxx是变量或标签 --> 第二遍读取阶段若Xxx不在符号表中,那Xxx一定是变量,将(Xxx,n)放入符号表,n代表下一个可使用的RAM地址,分配的RAM地址是连续的数字,从地址16开始,并翻译成A命令
  • D=M+A   //算术或逻辑运算 --> D命令
  • D;JMP    //跳转 --> D命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值