C编译器剖析_6.1 汇编代码生成_简介

本文介绍了UCC编译器如何将C程序转化为32位x86汇编代码,重点关注Linux平台的AT&T汇编。内容包括字符串与浮点常数的处理、全局变量与函数的生成、局部变量与形式参数的命名规则,以及函数的序言(Prologue)和尾声(Epilogue)。同时,详细解析了GetAccessName和LayoutFrame函数的功能。
摘要由CSDN通过智能技术生成

6.1 汇编代码生成简介

    历经词法分析、语法分析、语义检查和中间代码生成阶段,我们终于来到了“目标代码生成阶段”,由于UCC编译器的目标代码即为32位x86汇编代码,因此我们就把本章称为“汇编代码生成”。UCC编译器中的大部分源代码都适用于Windows和Linux平台,但Windows平台上缺省的汇编器支持Intel风格的x86汇编代码,而Linux平台默认的汇编器则采用AT&T风格的x86汇编代码,两者在汇编语法上有一些差别,为节省篇幅,我们主要针对Linux平台的AT&T汇编进行讨论。到了这一章,UCC编译器面对的输入早已不再是C源代码,而主要是由各个基本块构成的链表,我们要把基本块中的中间代码翻译成x86汇编代码。我们在“第1.5节结合C语言来学汇编”中,已介绍过x86汇编代码的相关语法和语义,这里不再重复。

    还是通过一个简单的例子来了解一下UCC编译器的汇编代码生成,如图6.1.1所示,第1至6行是一个简单的C程序,第11至58行是由UCC编译器产生的汇编代码。形如第13行C++风格的注释是我们人为加上去的,用于说明第14行的汇编代码“.data”是由Segment()函数产生。我们省略了main函数对应的汇编代码。


图6.1.1 汇编代码生成的例子

    在C程序中出现的字符串可被视为全局的字符数组(当然对C程序员而言,该字符数组的名称不可见),通过第15行的EmitStrings()函数,UCC编译器可以为字符串产生形如第16行的字符数组,而通过第18行的EmitFloatConstants函数,则可以为形如“1.0”的浮点常数分配存储空间。UCC编译器会隐式地为字符串和浮点常数命名,例如第16行的“.str0”和第19行的“.flt0”,这些名字都以“.”开始。按C语言的语法,由C程序员命名的变量名或函数名不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值