5.1 程序转换概述
1.“指令”的概念
(1) 计算机中的指令有微指令、机器指令和伪(宏)指令之分
机器指令 | 处于硬件和软件的交界面 (相当于一个菜谱指定的一个完整做菜过程) |
---|---|
微指令 | 是微程序级命令,属于硬件范畴 (相当于洗、切、煮、炒等做菜“微过程“ ) |
伪指令 | 是由若干机器指令组成的指令序列,属于软件范畴 (相当于由多个菜谱合成一个”大菜“的过程) |
汇编指令 | 是机器指令的汇编表示形式,即符号表示 |
(2)机器级指令
机器指令和汇编指令一一对应,它们都与具体机器结构有关,都属于机器级指令
2. 程序执行过程
(1)高级语言程序转换为机器代码的过程
(2)GCC使用
以下面的程序为例
//test.c
int add(int i,int j)
{
int x = i + j;
return x;
}
①test.c 经过预处理,汇编命令得到test.s,或直接使用命令得到
gcc -E test.c -o test.i //预处理
gcc -S test.i -o test.s //汇编
gcc -S test.c -o test.s //一步到位
②通过汇编命令,生成可重定位的目标文件test.o(二进制文件)
gcc -c test.s -o test.o
③通过反汇编可得到汇编指令
objdump -d test.o
(3)test.s文件与test.o文件比较
test.s文件
add:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 12(%ebp), %eax
movl 8(%ebp), %edx
leal (%edx, %eax), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
test.o文件
00000000 <add>:
(位移量 机器指令 汇编指令)
0: 55 push %ebp
1: 89 e5 mov %esp, %ebp
3: 83 ec 10 sub $0x10, %esp
6: 8b 45 0c mov 0xc(%ebp), %eax
9: 8b 55 08 mov 0x8(%ebp), %edx
c: 8d 04 02 lea (%edx,%eax,1), %eax
f: 89 45 fc mov %eax, -0x4(%ebp)
12: 8b 45 fc mov -0x4(%ebp), %eax
15: c9 leave
16: c3 ret
编译得到的与反汇编得到的汇编指令形式稍有差异
- 两者都包含所有的机器指令,用十六进制表示
- 可重定位目标文件的反汇编结果中,从0开始,每条指令的地址是相对于所在函数第一条指令的位移地址
- 可执行目标文件的反汇编结果中,每条指令的地址是一个绝对地址(确切的值/虚拟地址)
(4)两种目标文件
- test.o:可重定位目标文件
- test:可执行目标文件
test.o中的代码从
地址0
开始,test中的代码从80483d4
开始!
3. 可执行文件的存储器映像
5.2 IA-32指令系统概述
1. IA-32/x64指令系统概述
Intel处理器
- x86是Intel开发的一类处理器体系结构的泛称
–包括Intel 8086、80286、i386和i486等,因此其架构被 称为“x86”
–由于数字并不能作为注册商标,因此,后来使用了可注册的 名称,如Pentium、PentiumPro、Core 2、Core i7等
–现在Intel把32位x86架构的名称x86-32改称为IA-32
–IA是Intel Architecture的缩写- 由AMD首先提出了一个兼容IA-32指令集的64位版本
–扩充了指令及寄存器长度和个数等,更新了参数传送方式
–AMD称其为AMD64,Intel称其为Intl64(不同于IA-64)
–命名为“x86-64” ,有时也简称为x64
2. IA-32的体系结构
(1)组成
IA-32是典型的CISC(复杂指令集计算机)风格ISA
- 8个通用寄存器(8位、16位、32位)
- 2个专用寄存器: EIP(PC)、标志寄存器EFLAGS
- 6个段寄存器(间接给出段基址)
- 存储器地址空间为4GB,按字节编址,小端方式
- 寻址方式
–立即、寄存器、存储器(SR:[B]+[I]*s+A)
–相对寻址 - 变长指令字、变长操作码
- 汇编语言格式
–Intel格式汇编
–AT&T格式汇编
(2)计算机中数据的存储
- 指令中需给出的信息:
–操作性质(操作码)
–源操作数1 或/和源操作数2 (立即数、寄存器编号、存储地址)
–目的操作数地址 (寄存器编号、存储地址) 存储地址的描述与操作数的数据结构有关
(3) IA-32支持的数据类型及格式
IA-32架构由16位架构发展而来,因此,虽然字长为32位或更大 ,但一个字为16位,长度后缀为w;32位为双字,长度后缀为l ,long double实际长度为80位,但分配96位=12B(按4B对齐)
(4)IA-32的寄存器组织
反映了体系结构发展的轨迹,字长不断扩充,指令保持兼容 ST(0) ~ ST(7)是80位,MM0 ~MM7使用其低64位
(4)IA-32的标志寄存器
- 6个条件标志 – OF、SF、ZF、CF各是什么标志(条件码)?
– AF:辅助进位标志(BCD码运算时才有意义)
– PF:奇偶标志 - 3个控制标志
– DF(Direction Flag):方向标志(自动变址方向是增还是减)
– IF(Interrupt Flag):中断允许标志(仅对外部可屏蔽中断有用)
– TF(Trap Flag):陷阱标志(是否是单步跟踪状态) - ……
(5)IA-32机器指令格式
3. IA-32的寻址方式
(1)寻址方式
寻址方式:如何根据指令给定信息得到操作数或操作数地址
- 操作数所在的位置
– 指令中:立即寻址
– 寄存器中:寄存器寻址
– 存储单元中(属于存储器操作数,按字节编址):其他寻址方式
存储器操作数的寻址方式与微处理器的工作模式有关
– 两种工作模式:实地址模式和保护模式
- 实地址模式(基本用不到)
– 为与8086/8088兼容而设,加电或复位时
– 寻址空间为1MB,20位地址:(CS)<<4+(IP) - 保护模式(需要掌握)
– 加电后进入,采用虚拟存储管理,多任务情况下隔离、保护
– 80286以上微处理器的工作模式
– 寻址空间为232B,32位线性地址分段(段基址+段内偏移量)