程序的机器级表示
汇编代码是机器代码的文本表示,给出程序中的每一条指令。然后GCC 调用汇编器和链接器,根据汇编代码生成可执行的机器代码。
通常情况下,使用现代的优化编译器产生的代码至少与一个熟练的汇编语言程序员手工编写的代码一样有效。最大的优点是,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的。
1. 机器级代码
计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。对于机器级编程来说,其中两种抽象尤为重要。
第一种是由指令集体系结构或指令集架构(Instruction Set Architecture, ISA)来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。大多数IAS将程序的行为描述成好像每条指令都是按顺序执行的,一条指令结束后,下一条再开始。处理器并发的执行许多指令,但是通过一些措施保证整体行为与ISA指定的顺序执行的行为完全一致。
第二种是机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。
x86-64的机器代码和原始的C代码差别非常大。一些通常隐藏的处理器状态都是可见的:
- 程序计数器PC,用%rip表示,给出将要执行的吓一条指令在内存中的地址。
- 整数寄存器文件,包含16个命名的位置,分别存储64位的值。这些寄存器可以存储地址(对应于指针)或整数数据。有的寄存器被用来记录某些重要的程序状态,而其他的寄存器用来保存临时数据,例如过程的参数和局部变量,以及函数的返回值。
- 条件码寄存器保存着最近执行的算数或逻辑指令的状态信息。他们用来实现控制或数据流中的条件变化,比如说用来实现if和while语句。
- 一组向量寄存器可以存放一个或多个整数或浮点数值。
虽然C 语言提供了一种模型,可以在内存中声明和分配各种数据类型的对象,但是机器代码只是简单地将内存看成一个很大的、按字节寻址的数组。C 语言中的聚合数据类型,例如数组和结构,在机器代码中用一组连续的字节来表示。即使是对标

本文详细介绍了程序从高级语言到机器代码的转换过程,涉及汇编代码、目标代码和可执行代码的生成。通过例子展示了C语言代码如何被编译为汇编代码,再转化为机器代码,并解释了程序计数器、寄存器、虚拟地址等概念。同时,讨论了链接器的角色以及在最终可执行文件中如何定位和优化代码。
最低0.47元/天 解锁文章
1023

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



