


一次就生成汇编代码的话,工作量巨大,很多都是靠多次最终才能生成。


资源:
寄存器:32个
数据区:全局变量
代码区:汇编 二进制代码
堆区:动态分配
栈区:函数返回



栈式计算机


load 将元素从内存中加载到栈顶




栈式计算机因为每条指令的语义都比较简单


伪指令:机器读取指令时,就会为这几个变量分配空间,存储到内存中。

需要注意的是,分配空间时,没有值,通过从栈中弹出数据,store才有的值。
面向栈计算机:


递归下降:语法分析算法:函数分析函数;而此处是代码生成函数

因为是后计算的Gen_E(e2) e2的值会在栈顶,而后是e1,e1与e2计算之后的结果也存在栈顶。
语句的代码生成:栈的规模不变!
实际上是在做后序遍历(与语义分析的顺序相同)

T:类型

D:变量声明

最后的Gen_D 是因为会存在连续的声明


总体是Gen_P,而后是Gen_D,Gen_S

寄存器计算机:

risc就是寄存器计算机

假设有无限多个的时候,没有溢出。
movn:立即数
load store 【】:访存



需要注意Gen_E的返回值是一个寄存器;



加法左结合

中间就是抽象语法树,使用后序遍历递归生成汇编代码

本文深入探讨了栈式计算机和寄存器计算机的代码生成过程,包括寄存器分配、数据区与代码区的管理,以及如何通过后序遍历生成汇编代码。特别关注了栈式计算机的load与store操作,以及寄存器计算机的movn与loadstore指令。

被折叠的 条评论
为什么被折叠?



