Linux汇编之IA-32平台核心

汇编 2015年02月26日 ,

IA-32平台

本文中枫竹梦主要介绍IA-32平台的硬件元素及其基本组成。

成功地进行汇编语言程序设计的一个关键是了解编程的环境。编程环境是最重要的部分就是处理器。为了能够利用处理器的基本功能和高级特性,了解硬件平台至关重要。了解可以使用什么元素来帮助获得可以的最高执行速度,意味着快速应用程序与慢速应用程序有天壤之别。

总体介绍

处理器包含控制计算机操作的硬件和指令码。通过控制总线、地址总线、数据总线将处理器连接到计算机的其他设备。

处理器本身包含很多的组件,负责不同的功能。主要部件如下:

  • 控制单元
  • 执行单元
  • 寄存器
  • 标志

处理器

控制单元

处理器的核心是控制单元。控制单元的主要作用是控制处理器的动作。控制单元主要实现如下4个功能:

  • 从内存获得指令
  • 对指令进行解码以便进行操作
  • 从内存获得所需的数据
  • 如果必要,就存储结果

Intel处理器使用称为NetBurst的控制单元技术,其结合了4种单独的技术来帮助加快控制单元的处理速度:

  • 指令预取和解码
  • 分支预测
  • 乱序执行
  • 退役

控制单元

指令预取和解码器

由于从内存获取指令和数据比处理它们需要的时间长很多,建立预取(prefetch)的概念。试图在执行单元实际需要它们之前来获得它们。为了达到这个目的,处理器本身需要一个专门的存储区域,它比内存访问速度快的多。这使用管线操作(pipeline)实现。

IA-32使用2级或者更多的缓存实现管线操作。对指令和数据的缓存解决了访问内存慢的问题,但是带来了一个问题,不能保证程序将按照连续的顺序执行指令。如果程序采用分支,指令转移到内存中完全不同的位置,那么整个缓存需要重新进行填充。这缓解这个问题,创建了二级缓存。二级缓存比一级缓存大的多。可以保存更多的预取指令和数据,同时保存多个分支跳转之前的指令与数据。

汇编语言不能访问指令和数据缓存。程序中可以通过减少程序的分支来提高程序指令码的执行速度。

分支预测单元

缓存技术是加快程序执行速度的一个途径,但是没有解决程序分支跳转的问题。如果程序的分支很多,处理器多数时间在等待对指令码及数据的内存访问。为解决这个问题,引入了分支预测(branch prediction)。目前使用如下3种技术实现分支预测:

  • 深度分析预测
  • 动态数据流分析
  • 推理性执行

深度分析预测使用统计学算法预测程序在分支中最可能的执行途径。
动态数据流分析对处理器中的数据流进行统计学实时分析,将被预测的程序流程传递给乱序执行引擎进行处理。
推理性执行确定分支中不是立即需要执行的指令码,将其传递给乱序执行引擎进行处理。

乱序执行引擎

乱序执行引擎是为执行单元准备要处理的指令的地方。通过分析大量指令,乱序执行引擎能够找到程序可执行的独立指令。乱序执行引擎有3个部分:

  • 分配器
  • 寄存器重命名
  • 微操作调度器

分配器确保缓冲区空间被适当地分配给乱序执行引擎正在处理的每条指令。
寄存器重命名分配逻辑寄存器去处理需要寄存器访问的指令,它把指令提出的寄存器请求映射到某个逻辑寄存器上,以便允许多条指令对相同寄存器同时进行访问。寄存器映射使用寄存器分配表(register allocation table, RAT)完成的。
微操作调度器确定何时准备好处理微操作,将微操作发送给退役单元;微操作调度器使用两个队列,一个处理需要内存访问的微操作,另一个处理不需要内存访问的微操作。

退役单元

退役单元接收从管线解码器和乱序执行引擎发送来的所有微操作,并且试图将微操作重新调整为程序能够正确执行的适当顺序。

执行单元

处理器的主要功能是执行指令。执行指令是在执行单元中进行的。单一处理器可以包含多个执行单元,能够同时处理多条指令码。执行单元由一个或者多个运算逻辑单元(Arithmetic Logic Unit, ALU)构成的。ALU包含:

  • 简单整数操作
  • 复杂整数操作
  • 浮点操作

简单整数操作如加法、减法、布尔操作。奔腾4处理器每个时钟周期能够完成2个简单整数操作。
复杂整数操作,在4个时钟周期内完成大多数的移位和循环指令。乘法和除法通常需要14~60个时钟周期。
浮点操作处理浮点数的运算。

寄存器

为了加快对数据的访问速度,处理器包含内部的内存位置,称为寄存器(register)。寄存器能够存储要处理的数据元素,而无需访问内存存储单元。

IA-32平台可以使用的寄存器核心组如下:

寄存器 描述
通用 8个32位寄存器,存储正在处理的数据
6个16位寄存器,处理内存访问
指令指针 单一32位寄存器,指向要执行的下一条指令
浮点数据 8个80位寄存器,用于浮点数学数据
控制 5个32位寄存器,确定处理器的操作模式
标志 1个32位寄存器,标识处理器各项操作的成功与否
调试 8个32位寄存器,在调试处理器时包含信息

通用寄存器

寄存器 含义 描述
EAX Accumulator 累加寄存器,用于操作数据和结果数据的累加器
EBX Base 基址寄存器,指向数据内存段中的数据的指针
ECX Count 计数寄存器,字符串和循环操作的计数器
EDX Data 数据寄存器,I/O指针
EDI Destination Index 目的变址寄存器,用于字符串操作的目标的数据指针
ESI Source Index 源变址寄存器,用于字符串操作的源的数据指针
ESP Stack Pointer 堆栈指针寄存器
EBP Base Pointer 基址指针寄存器,堆栈数据指针

IA-32平台的寄存器名称前的E为Extened,意为扩展,相对于16位寄存器而言。

32位的EAX、EBX、ECX、EDX也可用16位和8位名称引用,如:AX、AH、AL等。

段寄存器

段寄存器用于引用内存位置,IA-32平台采用3种不同的方式访问内存:

  • 平坦内存模式
  • 分段内存模式
  • 实地址内存模式

平坦内存模式把全部系统内存表示为连续的地址空间。所有指令、数据和堆栈都包含在相同的地址空间中。通过称为线性地址(linear address)的特定地址访问每个内存位置。

分段内存模式把系统内存划分为独立的组,称为段。通过段寄存器中的指针进行引用。每段包含特定类型数据。

寄存器 含义 描述
CS Dode Segment 代码段
DS Data Segment 数据段
SS Stack Segment 堆栈段
ES Extra Segment 附加段指针
FS 附加段寄存器 附加段指针
GS 附加段寄存器 附加段指针

实地址内存模式下所有段寄存器都指向线性地址的零,且不会被程序改动。

指令指针寄存器

指令指针寄存器(EIP, Instruction Pointer),也称为程序计数器(program counter),指向要执行的下一条指令。其不能通过程序直接修改,但可以使用程序控制指令来改变它。

在平坦内存模式下,EIP包含指向下一条指令码的内存位置的线性地址。在分段内存模式下,EIP指向逻辑内存地址,通过CS寄存器的内容引用。

控制寄存器

控制寄存器用于确定处理器的操作模式,还在当前正在执行的任务的特性。

控制寄存器 描述
CR0 控制操作模式和处理器状态的系统标志
CR1 当前没有使用
CR2 内存页面错误信息
CR3 内存页面目录信息
CR4 支持处理器特性和说明处理器特性能力的标志

控制寄存器可以通过与通过寄存器之间的数据传送查看或修改其值。系统程序员经常修改控制寄存器的值。

标志

标志寄存器(EFLAGS)用于标识处理器的每个操作的成功与否。EFLAGS包含32位信息,并映射为表示特定信息的标志。目前有17位被使用。按功能将其分为3组:

  • 状态标志
  • 控制标志
  • 系统标志

状态标志

状态标志用于表明处理器数据操作的结果状态。

标志 名称
CF 0 进位标志(Carry flag)
PF 2 奇偶校验标志(Parity flag)
AF 4 辅助进位标志(Auxiliary carry flag)
ZF 6 零标志(Zero flag)
SF 7 符号标志(Sign flag)
OF 11 溢出标志(Overflow flag)

无符号整数值的数学操作产生最高有效位的进位或借位,CF置1,否则置0。

数据操作的结果寄存器中为1的位为偶数,PF置1,否则置0。

AF用于二进制编码的二进制数据操作中。寄存器的第3位发生进位或借位,AF置1,否则置0。

操作结果为0,ZF置1,否则置0。

操作结果最高位为符号位,SF置1,否则置0。

有符号数运算结果正值过大,或者负值过小时,OF置1,否则置0。

控制标志

控制标志(Direction flag, DF)表示处理字符串的方式。DF为1时,字符串指令自动递减内存地址;DF为0时,字符串指令自动递增内存地址。

系统标志

标志 名称
TF 8 陷阱标志(Trap flag)
IF 9 中断标志(Interrupt enable flag)
IOPL 12和13 I/O特权级别标志(I/O privilege level)
NT 14 嵌套任务标志(Nested task flag)
RF 16 恢复标志(Resume flag)
VM 17 虚拟8086模式标志(Virtual 8086 Mode flag)
AC 18 对准检查标志(Alignment check flag)
VIF 19 虚拟中断标志(Virtual interrupt flag)
VIP 20 虚拟中断挂起标志(Virtual interrupt pending flag)
ID 21 识别标志(ID flag)

陷阱标志为1时,启用单步模式,每次处理器只执行一条指令。

中断使能标志控制如何响应外部中断信号。

I/O特权级别标志表明当前任务的I/O特权级别。

嵌套任务标志控制当前正在运行的任务是否链接到前一个执行的任务。

恢复标志控制调试模式中如何响应异常。

虚拟8086标志表明处理器在虚拟8086模式下运行。为向前兼容。

对准检查标志用于启用内存引用的对准检查。

在虚拟模式中进行操作时,虚拟中断标志起IF标志作用。

在虚拟模式中进行操作时,虚拟中断挂起标志用于表示一个中断正被挂起。

ID标志表示处事器是否支持CPUID指令。

参考链接:http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《Linux汇编之IA-32平台核心》
日志链接:http://furzoom.com/linux-asm-ia-32-1/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部