编译器——指令的汇编

  • Post author:
  • Post category:其他




术语

  • Instruction Stream 指令流, 表示当你连接所有的操作码和操作数并且连续不断的把它们有序的组合在一起从而出现的数据
  • forward referene 前向引用
  • resolving the jump 跳转指令的解析
  • Directives 指示符



总结

  • 指令汇编需要指令查找表,如果找不到就报错,找得到就根据操作数类型来分别其操作数是否合理,不合理就报错。【他的实现用哈希表最好】
  • 字符串表,将字符串单独写到其他位置,并维持一个字符串表,将字符串所在位置替换成字符串在表中的索引
  • 操作数的汇编,操作数有很多类型,将指令输出为 指令码——操作数个数——操作数类型——操作数…
  • 变量汇编 变量本身有局部变量和全局变量,简单起见,全部放置在堆栈中, 局部变量总是位于堆栈的顶部,将全局变量放置在堆栈的底部。然后将其替换为堆栈中的索引,为了和操作数区别,需要将其类型标记为堆栈索引类型
  • 标签使用两次遍历,第一次遍历的时候将标签名字以及标签后面指令的行号记录到标签表中。当第二次遍历的时候,如果遇到标签,就搜索标签表,如果找不到就直接报错,找得到就替换为标签对应的行号
  • 函数的汇编,和标签采用同样的方式,两次遍历,并维持一个函数表,记录函数名字和自己作用域内的第一条指令,然后在第二次遍历的时候将调用函数的地方更换成在函数表内的索引



指令的汇编

  • 将指令助记符映射成操作码,需要用到指令查找表
  • 哈希表是最好的实现,允许在线性时间内把字符串当做索引使用

    在这里插入图片描述

在这里插入图片描述

  • 这个指令查找表由三部分组成,助记符字符串,操作码,还有指令的操作码列表
  • 操作码列表就是一系列某种标志【通常存储在一个简单的位向量数组中】,汇编器使用它来确保给指定的指令提供的操作数是正确的



变量的汇编

  • 变量或者数组索引就是一个符号名,把它们和相关的堆栈索引进行关联
  • 堆栈索引通常和声明它的函数的堆栈框架的栈顶相关
  • 一个活动的函数的堆栈框架通常在堆栈的顶部
  • 函数的堆栈框架从顶部开始向下,分别是局部数,函数调用者的返回地址,传递参数
  • 在Lua中堆栈可以用两种方法访问,正索引和负索引

    在这里插入图片描述



操作数的汇编

  • 我们需要在每个操作数前面加上编码前缀,让VM可以方便地根据这些编码读取并翻译数据
  • 对于操作数类型编码本身,就是简单的整数值,只要VM能够识别,实际数值多少无所谓

    在这里插入图片描述
  • 还有一个信息,一共有多少个操作数
  • 在操作码和第一个操作数之间,你需要插入另外一个整数值来记录紧接着会有多少个操作数
  • 对于Mov指令,这个数是2,对于Jmp指令,这个数是1
Mov MyVar,16384  //已经知道MyVar的堆栈索引为-8
0  2  3  -8  0  16384 // 2是个数,3和0是操作数的类型

在这里插入图片描述



标签汇编

  • 注意一个文件中所包含的行数并不一定等于它所包含的指令的数量



版权声明:本文为qq_33574890原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。