机器级编程的重要抽象
对于机器级编程来说,两种抽象尤为重要:
- ISA,全称为
指令集体系结构
或指令集架构
,它定义了处理器状态、指令的格式以及每条指令对状态的影响,用于屏蔽了硬件处理指令的复杂行为,将程序的每条行为描述为顺序执行 - 内存虚拟化,它将多个硬件存储器和操作系统软件结合起来,将对外提供的内存模型抽象为一个很大的字节数组
重要的处理器状态
- 程序计数器:给出将要执行的下一条指令在内存中的地址
- 整数寄存器文件,包含16个命名的位置,分别存储64位的值,这些寄存器可以存储地址或整数数据
- 条件寄存器,保存着最近执行的算术或逻辑指令的状态信息
- 一组向量寄存器,可以存放一个或多个整数或浮点数的值
机器级代码的特点
我们可以通过C语言在内存中声明和分配各种数据类型的对象,但是机器代码只是很简单的将内存看做是一个很大的、按照字节寻址的数组。汇编代码不区分有符号或无符号整数,不区分各种类型的指针,甚至不区分指针和整数
程序内存
程序的内存包括:
- 程序的可执行机器代码
- 操作系统需要的一些信息
- 用来管理过程调用和返回的运行时栈
- 用户分配的内存块
数据格式
Intel用术语字
表示16位的数据类型,因此也将32位数称为双字
,64位数称为四字
对于x86-64系统而言,C语言的各种数据类型的信息如下:
C声明 | Intel数据类型 | 汇编代码后缀 | 字节大小 |
---|---|---|---|
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l | 4 |
long | 四字 | q | 8 |
char* | 四字 | q | 8 |
float | 单精度 | s | 4 |
double | 双精度 | 1 | 8 |
注意:大多数GCC生成的汇编代码指令都有一个字符的后缀,表明操作数的大小,例如:
- movb: 传送字节
- mobw: 传送字
- movl: 传送双字
- movq: 传送四字