C编译器剖析_6.3.4 汇编代码生成_为函数调用与返回产生汇编代码

C编译器剖析_6.3.5 汇编代码生成_为类型转换产生汇编代码 6.3.5  为类型转换产生汇编代码     在这一小节中,我们来讨论一下整型和浮点型之间的类型转换。有些类型转换并不需要在汇编层次进行数据转换,例如int和unsigned  int之间的转换只是改变了表达式的类型,对数据本身并无影响,以下表达式“(unsigned int) a”对应的二进制数据为0xFFFFFFFF,而表达式“a”对应的二进制数据也为0xFFFFFFFF。但对相同内容的二进 阅读详情

6.3.4        为函数调用与返回产生汇编代码

    在这一小节中,我们来讨论一下如何为函数调用和函数返回生成汇编代码。函数调用对应的中间指令如下所示:

         //中间指令的四元式: < opcode, DST, SRC1, SRC2>

         <CALL, 用于接收返回值的变量retVal, 函数名func,  参数列表[arg1,arg2, …,argn]>

    让我们先熟悉一下C函数的调用约定CallingConvention,我们需要把参数从右向左入栈(即从argn到arg1依次入栈),不妨记这些参数所占用的总内存为stksize字节。当函数调用返回后,主调函数要负责把这些参数出栈,这可通过形如“addl  stksize, %esp”的汇编指令来实现。{eax, ecx, edx}这3个寄存器要由主调函数负责保存,在产生call汇编指令之前,要对这几个寄存器进行必要的回写操作。而{ebx,esi,edi}这3个寄存器则由被调函数负责保存,UCC编译器会在所有函数的入口处保存这几个寄存器。     为了加快返回值的传递,我们会尽量把返回值放在寄存器中。在x86平台上,按C标准的约定:

    (1) 若返回值为整型,则存于eax寄存器中(我们只考虑32位平台);

    (2) 若返回值为浮点型,则存于x87栈顶寄存器中;

    (3) 按C的语法要求,返回值不可以是数组类型。如果返回值是1、2或4字节的结构体对象,则存于寄存器eax中,若是8字节,则存于[edx: eax]中。若返回值是其他大小的结构体对象,则C编译器会为函数添加结构体指针作为第1个参数,如下所示。

         typedef struct  Data{

             int  num[8];      //共32字节

         } dt;

         dt =  GetData();

         //经C编译器处理后,真正执行的函数调用为:

C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程 6.3.1  由中间指令产生汇编代码的主要流程     在这一小节,我们可把关注的焦点放在“如何把某条中间代码翻译成汇编代码”上。UCC编译器的中间代码是如下所示的四元式,包括运算符和3个操作数。              当然有些中间代码只需要用到opcode和DST就可以了,例如,无条件跳转指令“goto  BB2;”就不需要SRC1和SRC2。为了便于汇编代码的生成,UCC编译器在u 阅读详情

相关推荐

C编译器剖析_6.3.3 汇编代码生成_为跳转指令产生汇编代码

6.3.3        为跳转指令产生汇编代码     在这一小节中,我们要为“有条件跳转”、“无条件跳转”和“间接跳转”产生相应的汇编指令。中间指令的四元式如下所示:             (1) 有条件跳转,例如“if (a                         ////////对应的汇编代码//////////             movl  a, %ea

SheIsC的专栏 2317

C编译器剖析_6.3.6 汇编代码生成_为“取地址”产生汇编指令

6.3.6  为“取地址”产生汇编指令     在这一小节中,我们来讨论一下以下两条中间指令的翻译:     (1)取地址指令               例如 ,表示取number的地址并保存到临时变量t0中     (2)对象清零指令             例如,表示把arr所占16字节的内存清零     我们先举一个例子来说明,对于图6.3.14第4行局部数组arr的初

SheIsC的专栏 1947

C编译器剖析_6.2 汇编代码生成_寄存器的管理

在计算机中,CPU的速度比内存的速度快得多,编译器应尽量有效地利用寄存器资源,减少对内存的不必要访问,从而提高由编译器生成的汇编代码的运行速度。在中间代码生成阶段,UCC编译器用临时变量t来存放形如“t: a+b;”的公共子表达式的值;到了汇编代码生成时,UCC编译器会尽可能地把这些公共子表达式的值存放在寄存器,当需要再次重用时,就可以直接由相应的寄存器中得到。不过,CPU中寄存器的资源是很有限的

SheIsC的专栏 1703

C编译器剖析_1.4 UCC编译器预览_UCC的使用

1.4.1  UCC的使用     通过第1.3节的例子ucc\examples\sc,我们对如何根据语言的文法来编写语法分析器,建立语法树,之后在语法树的基础上生成中间代码有了一个感性的直观认识。当然,光有这些中间代码,C程序员还不能得到其所要的计算结果。C编译器还要由中间代码产生汇编代码。在剖析UCC编译器前,让我们先熟悉一下UCC编译器的使用。UCC编译器的大部分代码都是用标准C语言并调用

SheIsC的专栏 4600

编译原理_过程调用—四元式生成

主要是针对类似于:fa(a-b*(c-(d-m)),m-n*k+u)这样的过程调用语句进行翻译,当然,可以稍微改改,就可以对赋值以及算术表达式翻译。

iSC-OpenAPI接口测试工具

支持现已发布且具备 API 网关的 iSC 平台(1.1.0-1.3.0)的 Http-OpenAPI 接口调用; 支持 http/https 协议的接口调用; 依赖.net 4.5 环境; 支持图片相关接口的调用(获取门禁事件的图片、查询车辆抓拍图片、人脸应用-图片下 载、提取人员图片等接口);

编译原理四元式的实现

编译原理的中间代码生成阶段的四元式的算法实现,vc++6.0实现,含Word版算法。

赋值语句翻译c语言实现(四元式)

此程序使用算符优先法的语义分析方法实现了将赋值语句翻译为四元式的功能。这种仅将{=,+,-,*,/}当做运算符,而将括号当做深度的变种算符优先法,很好控制,很容易就能翻译赋值语句。该程序是linux平台下的,若要在Windows下,只需将头文件unistd.h改为io.h

Autodesk全家桶:从AutoCAD到Maya,设计师必备的7款神器全解析

本文全面解析Autodesk全家桶中的7款设计师必备软件,包括AutoCAD、Revit、Inventor、Fusion 360、Maya和3ds Max等。从二维制图到三维建模,从建筑信息模型(BIM)到影视动画制作,这些工具在工程设计、建筑可视化和数字创意领域展现出强大的协同效应。通过实战案例展示如何整合工作流,显著提升设计效率与项目质量。

weixin_29237635的博客 460

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 505

Nmap的介绍、安装 并进行网络扫描

Nmap概述 Nmap(Network Mapper(网络映射器))是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。 正如大多数被用于网络安全的工具,nmap 也是不少黑客及骇客(又称脚本小子)爱用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。

Cheney ' blog 2万+

使用mid360运行lio-livox对比fast-lio2

msg_type为激光雷达发出的数据格式,有livox自定义数据类型格式CustomMsg和ros标准的PointCloud2格式,因此首先需要确定激光雷达端配置的是哪种格式。可以从激光雷达的ros驱动中看到驱动端有三种格式可以选,驱动端的数字2对应lio-livox中的1,驱动端的0对应lio-livox的格式0。如果使用的是Ubuntu18.04编译完成后运行直接成功,如果使用20.04运行会报错,需要修改以下源代码。针对livox-mid360 运行lio-livox的一些问题。

z1872385的博客 1229

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

基于simulink的电气弹簧ES稳压控制模型仿真

若要补偿母线电压的谐波,需控制ES上的谐波,即在单闭环母线电压有效值控制的基础上,增加谐波抑制环节来进行谐波控制,现有的各种检测和抑制谐波的方法有采用模拟滤波器、傅里叶分析进行谐波分析、基于瞬时无功功率理论的方法等。当关键负载ZC为电流源型非线性负载时,电路原理图如图7所示,由于电流源型非线性负载可以等效为谐波电流源,关键负载电流ic便会含有谐波分量,导致输电线电流is和母线电压VS同样会含有谐波分量,导致供电质量的严重下降,对用电设备的正常工作造成影响。分别为流过线路阻抗、非关键负载、关键负载的电流,

FPGA/MATLAB学习教程/源码/项目合作开发 1631

【QT开发教程】如何在Qt中使用Protobuf进行高效数据序列化

Protocol Buffers(Protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化机制,常用于数据交换和存储。Qt作为一个跨平台的C++图形用户界面应用框架,可以与Protobuf结合使用,实现高效的数据序列化和反序列化。本文将介绍如何在Qt中集成和使用Protobuf,包括基本概念、安装步骤、使用示例以及实际应用。

科技改变人类,技术成就未来 1440

详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令

ce123的技术博客 19万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: C编译器剖析_6.3.3 汇编代码生成_为跳转指令产生汇编代码
下一篇: C编译器剖析_6.3.5 汇编代码生成_为类型转换产生汇编代码
SheIsC
博客等级 码龄12年 224粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值