- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 程序的机器级表示
3.1 序言 历史观点
机器代码:用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信。
汇编代码:GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。GCC调用汇编器和链接器,根据汇编代码生成可执行的机器代码。
注:① 用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的
② 汇编代码的两种格式:ATT、Intel
生成Intel格式的代码的命令:
1inux gcc -Og -S -masm=intel mstore.c
IA32:Intel 32位体系结构(Intel Architecture32),Intel在1985年提出
x86-64:即Intel64,IA32的64位拓展
后向兼容:较早版本上编译的代码可以在较新的处理器上运行
摩尔定律(Moore’s Law):1965年, Gordon Moore, Intel公司的创始人,根据当时的芯片技术做出的预测。在未来10年,芯片上的晶体管数量每年都会翻一番。事实是,在超过50年中,半导体工业一直能够使得晶体管数目每18个月翻一倍
3.2 程序编码
假设一个C程序,有两个文件p1.c和p2.c,我们用Linux命令将源代码转化成可执行代码
linux gcc -Og -o p p1.c p2.c
注:-Og表示优化等级。为了提高程序的性能,可以选择较高级别的优化(例如,-O1或-O2)
gcc命令调用了一整套的程序,将源代码转化成可执行代码:
C预处理器(C preprocessor,cpp)扩展源代码,插人所有用#include命令指定的文件,并扩展所有用#define声明指定的宏
编译器(compiler)产生两个源文件的汇编代码,名字分别为p1.s和p2.s
汇编器(assembler)将汇编代码(.s)转化成二进制目标代码文件(.o)p1.o和p2.o 。目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但是还没有填入全局值的地址、缺少不同文件代码之间的联系
链接器(linker)将两个目标代码文件与实现库函数(例如printf)的代码合并,并产生最终的可执行代码文件p(由命令行指示符-o p指定的)。解析文件之间的引用,为函数调用找到匹配的函数的可执行代码的位置。可执行代码文件是机器代码的第二种形式,也就是处理器执行的代码格式
机器级编程两种重要抽象:
①指令集体系结构 (Instruction Set Architecture, ISA)定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。大多数ISA,包括x86-64,将程序的行为描述成好像每条指令都是按顺序执行的,一条指令结束后,下一条再开始。处理器的硬件远比描述的精细复杂,它们并发地执行许多指令,但是可以采取措施保证整体行为与ISA指定的顺序执行的行为完全一致
②机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组
x86-64的机器代码和原始的C代码差别非常大
①一些通常对C语言程序员隐藏的处理器状态都是可见的:
程序计数器(通常称为“PC”,在x86-64中用%rip表示):给出将要执行的下一条指令在内存中的地址
整数寄存器文件:包含16个命名的位置,分别存储64位的值。这些寄存器可以存储地址(对应于C语言的指针)或整数数据。有的寄存器被用来记录某些重要的程序状态,而其他的寄存器用来保存临时数据,例如过程的参数和局部变量,以及函数的返回值
条件码寄存器:保存着最近执行的算术或逻辑指令的状态信息。它们用来实现控制或数据流中的条件变化,比如说用来实现if和while语句
向量寄存器:可以存放一个或多个整数或浮点数值
②机器代码只是简单地将内存看成一个很大的、按字节寻址的数组。C语言中的聚合数据类型,例如数组和结构,在机器代码中用一组连续的字节来表示。即使是对标量数据类型,汇编代码也不区分有符号或无符号整数,不区分各种类型的指针,甚至于不区分指针和整数
对于一个C语言代码文件mstore.c
生成汇编代码:
linux gcc -Og -S mstore.c
产生汇编文件mstore.s
编译并汇编该代码:
linux gcc -Og -c mstore.c
产生目标代码文件mstore.o 注:它是二进制格式的,无法直接查看
反汇编器(disassembler):根据机器代码产生一种类似于汇编代码的格式。
linux objdump -d mstore.o
链接,生成可执行文件prog
1inux gcc -Og -o Prog main.c mstore.c
关于机器代码和它的反汇编
您可能关注的文档
- 计算机系统课件-第9章 L4动态内存分配-高级概念.pptx
- 计算机系统课件-第10章 系统级IO.pptx
- 计算机系统实验报告- 二进制炸弹.docx
- 计算机系统实验报告- 微壳.docx
- 计算机系统实验报告-DataLab 数据表示.docx
- 计算机系统实验报告-动态内存分配器.docx
- 计算机系统实验报告-高速缓冲器模拟.docx
- 计算机系统实验报告-缓冲器漏洞攻击.docx
- 计算机系统实验报告-计算机系统漫游.docx
- 计算机系统实验报告-链接.docx
- 10《那一年,面包飘香》教案.docx
- 13 花钟 教学设计-2023-2024学年三年级下册语文统编版.docx
- 2024-2025学年中职学校心理健康教育与霸凌预防的设计.docx
- 2024-2025学年中职生反思与行动的反霸凌教学设计.docx
- 2023-2024学年人教版小学数学一年级上册5.docx
- 4.1.1 线段、射线、直线 教学设计 2024-2025学年北师大版七年级数学上册.docx
- 川教版(2024)三年级上册 2.2在线导航选路线 教案.docx
- Unit 8 Dolls (教学设计)-2024-2025学年译林版(三起)英语四年级上册.docx
- 高一上学期体育与健康人教版 “贪吃蛇”耐久跑 教案.docx
- 第1课时 亿以内数的认识(教学设计)-2024-2025学年四年级上册数学人教版.docx
网络工程师持证人
本人已从事浙江省工程咨询5年,对浙江省内工程信息非常熟悉,可获取新建工程相关联系人、设计院、业主等关键信息。另外从事楼宇自控专业已10年,考取了一建二建等资格证书,有关考试方面的问题(考试心得、方法、学习资料等)都欢饮来咨询交流。
文档评论(0)