计算机系统基础(一)笔记——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

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
2
3
4
5
6
7
int x;
float a[100];
short b[4][4];
char c;
double d[10];
//linux下double按4B对齐,windows下double按8B对齐
//windows下d[0]的地址必须是8的倍数
image-20240521165939354

各变量的寻址方式?

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,按字节编址,小段方式

  • 寻址方式:立即、寄存器、存储器、相对寻址

    变长指令字、变长操作码


计算机系统基础(一)笔记——Week5 IA-32指令系统
http://kcollision.github.io/2024/05db4e8ad9.html
作者
collision
更新于
2024年5月25日
许可协议