5. IA-32指令系统概述

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位线性地址分段(段基址+段内偏移量)
(2)保护模式下的寻址方式

在这里插入图片描述

(3)存储器操作数的寻址方式

在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值