23 | 生成汇编代码(二):把脚本编译成可执行文件
该思维导图由 AI 生成,仅供参考
从 playscript 生成汇编代码
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了编译器后端工作的实质,重点介绍了从AST生成汇编代码的完整过程,包括函数调用和参数传递、加法运算的翻译逻辑以及代码优化。通过示例代码和详细解释,读者可以了解如何生成汇编代码,如何使用寄存器进行充分优化,以及整体的汇编代码生成逻辑。文章还提到了对playscript程序进行编译并生成可执行文件的过程,以及建议基于现有代码框架进行修改,增加其他特性。最后,挑战读者用playscript生成目标文件,让C语言来调用,以证明playscript生成汇编代码的逻辑可靠。此外,文章还介绍了链接过程和可执行文件的结构,为读者提供了对编译过程的全面理解。整体而言,本文是一份有价值的技术指南,对于想深入了解编译器后端工作的读者具有重要参考价值。
《编译原理之美》,新⼈⾸单¥59
全部留言(4)
- 最新
- 精选
- 沉淀的梦想https://github.com/RichardGong/PlayWithCompiler/blob/d1f393d98000e8e9a7b22b870b690cd80de35bae/playscript-java/src/main/play/AsmGen.java#L470 这一行是不是应该改成`Function function = (Function) at.node2Scope.get(ctx);`,不然运行时会出现空指针异常
作者回复: 是的,我后来似乎改过了。因为修改了一些语义分析的代码,使得一些类型信息不再保存在AnnotatedTree.typeOfNode中了。 我抽时间应该加上一些自动的测试用例,避免修改一个地方,让另一个地方break掉。
2019-10-162 - humorcannot execute binary file 为什么我运行在mac上运行as命令后编译的机器码,会报这个错误呀
作者回复: 这是我的疏漏。as是生成目标文件。需要再链接一下才能生成可执行文件。文稿我已经修改了!
2020-03-19 - 沉淀的梦想老师,栈顶为什么要16字节对齐呢?
作者回复: 调用约定。 可以参考一下https://en.wikipedia.org/wiki/X86_calling_conventions "In Linux, GCC sets the de facto standard for calling conventions. Since GCC version 4.5, the stack must be aligned to a 16-byte boundary when calling a function (previous versions only required a 4-byte alignment.)" 如果不遵守这个调用约定,有些功能会出错。比如调试的时候。 还可以参考一下这篇:https://software.intel.com/en-us/forums/intel-isa-extensions/topic/291241
2019-10-16 - minghu6汇编的代码有些罗嗦,好多段的命名跟编译器生成似的. 有一个问题就是实例代码里有一个main标签里面的`subq $16, %rsp` 说是为了16对齐, 但main本身push了一个8byte的返回地址吧?2021-05-30