计算机系统基础(一)笔记——Week5 IA-32指令系统
本文最后更新于:2024年5月25日 凌晨
Week5 IA-32指令系统
5.1 程序转换概述
机器级指令
- 机器指令和汇编指令一一对应,都是机器级指令
- 机器指令是0/1序列,由若干字段组成
100010 DW mod reg r/m disp8
100010 0 0 01 001 001 11111010
操作码 寻址方式 寄存器编号 立即数(位移量)
-
汇编指令是机器指令的符号表示(==可以有不同格式==)
mov [bx+di-6],cl
表示功能M[R[bx]+R[di]-6] <- R[cl]
后面的是寄存器传送语言RTL,R寄存器内容,M存储单元内容
两种目标文件
test.o
可重定位目标文件,test
可执行目标文件
objdump -d test.o
反汇编后查看
ISA规定了一台机器的指令系统涉及到的所有方面
- 所有指令的指令格式、功能
- 通用寄存器的个数、位数、编号和功能
- 存储地址空间大小、编址方式、大/小端
- 指令寻址方式
5.2 IA-32指令系统
IA-32/x64指令系统概述
- x86是Intel开发的一类处理器体系结构的泛称
包括Intel 8086、80286等,由于数字不能作为商标,改为了Pentium、Core 2、Core i7等
现在Intel把32位x86架构的名称x86-32改为IA-32(Intel Architecture)
-
AMD首先提出了兼容IA-32指令集的64位版本
扩充了指令和寄存器长度和个数等
AMD称为AMD64,Intel称其为Intl64
命名为x86-64(x64)
IA-32
-
8个GPR(0-7),一个EFLAGs,PC是EIP
-
可寻址空间4GB(0-0xFFFFFFFF)
-
指令格式变长、操作码变长、指令由若干字段(OP、Mod、SIB等)组成
IA-32支持的数据类型和格式
C语言声明 | Intel操作数类型 | 汇编指令长度后缀 | 存储长度(位) |
---|---|---|---|
(unsigned) char | 整数/字节 | b | 8 |
(unsigned) short | 整数/字 | w | 16 |
(unsigned) int | 整数/双字 | l | 32 |
(unsigned) long int | 整数/双字 | l | 32 |
(unsigned) long long int | - | - | 2×32 |
char * | 整数/双字 | l | 32 |
float | 单精度浮点数 | s | 32 |
double | 双精度浮点数 | l | 64 |
long double | 扩展精度浮点数 | t | 80/96 |
IA-32由16位架构发展而来,因此虽然字长为32位,但一个字为16位,长度后缀为w;32位为双字,长度后缀为l,long double实际长度为80位,但分配96位=12B(按4B对齐)
IA-32的寄存器组织
反映了体系结构发展的轨迹,字长不断扩充,指令一直适配
IA-32的标志寄存器EFLAGS
-
6个条件标志
AF:辅助进位标志
PF:奇偶标志
-
3个控制标志
DF(Direction Flag):方向标志
IF(Interrupt Flag):中断允许标志
TF(Trap Flag):陷阱标志
IA-32的寻址方式
-
操作数所在位置:
指令中 寄存器中 存储单元中 立即寻址 寄存器寻址 (存储器操作数)其他寻址方式 存储器操作数的寻址方式和微处理器的工作模式有关
-
实地址模式(基本用不到)
为8086/8088兼容设置,加电或复位时
寻址空间1MB,20位地址:(CS)<<4+(IP)
-
保护模式(需要掌握)
加电后进入,采用虚拟存储管理,多任务情况下隔离、保护
80286以上微处理器的工作模式
存执空间2^32B(4G),32位线性地址分段
-
-
保护模式下:
对于存储器操作数
LA(线性地址)=SR(段寄存器)+A(给定地址段的位移量)+X(根据不同情况分别设置)
涉及==分段虚拟管理方式==,后续会详细讨论…
相对寻址
LA=(PC)+A,跳转目标指令地址
高级语言中寻址举例
1 |
|
各变量的寻址方式?
x
c
:位移/基址
a[i]
:104+i×4,比例变址+位移
d[i]
:544+i×8,比例变址+位移
b[i][j]
:504+i×8+j×2,基址+比例变址+位移
将b[i][j]
取到AX
中的指令可以是:movw 504(%ebp,%esi,2),%ax
,其中i×8在EBP中,j在ESI中,2是比例因子
IA-32机器指令格式
指令段 | 操作码 | 寻址方式 | SIB | 位移 | 直接数据 | ||||
---|---|---|---|---|---|---|---|---|---|
字节数 | 1或2 | 0或1 | 0或1 | 1、2、4 | 立即数 | ||||
Mod(2) | Reg/OP(3) | R/M(3) | SS(2) | Index(3) | Base(3) |
- 3位移量和立即数都可以是1B、2B、4B
- SIB中基址B和变址I都可以是8个GRS中任一个;SS给出比例因子
- 操作码:opcode;W与机器模式(16、32位)一起确定寄存器位数(AL、AX、EAX);D:操作方向(确定源和目标)
- 寻址方式:mod、r/m、reg/op三个字段与w字段和机器模式(16/32)一起确定操作数所在的寄存器编号或有效地址计算方式
8d 04 02 leal (%edx,%eax,1),%eax
1000 1101 00 000 100 00 000 010
操作码 寻址方式 SIB
总结
IA-32是典型的CISC(复杂指令集计算机)风格ISA
-
8个GPRs(8位、16位、32位)
-
2个专用寄存器:EIP(PC)、EFLAGS
-
6个段寄存器(间接给出段基址)
-
存储空间4GB,按字节编址,小段方式
-
寻址方式:立即、寄存器、存储器、相对寻址
变长指令字、变长操作码