4.2.5 IA-32的寻址方式
在8086到80286CPU 中,与数据有关的寻址方式主要有:立即寻址、寄存器寻址、直接寻址、寄存间接寻址以及寄存器相对寻址等几种。在IA-32中,还包括图4.11 中给出的IA-32中的各种寻址方式。存储器操作数的寻址方式与CPU 的工作模式有关。IA-32CPU主要有两种工作模式,即实地址模式和保护模式。
实地址模式是为与8086/8088兼容而设置的,在加电或复位时处于这一模式。此模式下的存储管理、中断控制以及应用程序运行环境等都与8086/8088相同。
保护模式的引入是为了实现在多任务方式下对不同任务使用的虚拟存储空间进行完全的隔离,以保证不同任务之间不会相互破坏各自的代码和数据。保护模式是80286以上高档CPU 最常用的工作模式。系统启动后总是先进入实地址模式,对系统进行初始化,然后转入保护模式进行操作。在保护模式下,处理器采用虚拟存储器管理方式。
图4.11 IA-32寻址方式
IA-32在保护模式下提供了多种寻址方式,其中存储器寻址方式采用的是段页式虚拟存储管理方式,CPU 首先通过分段方式得到线性地址LA,再通过分页方式实现从线性地址到存储器物理地址的转换。
具体来说,应用程序中使用的是逻辑地址,格式为:
16位段描述符索引:32位偏移地址
16位段描述符索引由段寄存器提供。在全局描述符表寄存器GDTP或局部描述符表寄存器LDTR 协助下,可以根据段描述符索引确定段基址。
确定段基址后,可以将逻辑地址转换为线性地址:
线性地址=32位段基址+32位偏移地址
然后在处理器页表机制下,再将线性地址转变为物理地址:
物理地址=页表转换(线性地址)
图4.11中除了最后一行(相对地址)计算的是转移目标指令的线性地址以外,其他的都是指操作数的线性地址。相对寻址的线性地址PC(即EIP或IP)有关,而操作数的线性地址与PC无关,它取决于某个段寄存器的内容和有效地址。根据段寄存器的内容能够确定操作数所在的段在某个存储空间的起始地址,而有效地址则给出了操作数所在段的偏移地址。
从图4.11中也可以看出,在存储器操作数的情况下,指令必须显式或隐式地给出以下信息。
①段寄存器SR(可用段前缀显式给出,也可默认使用默认段寄存器)。
②8/16/32位位移量A(由位移量字段显示给出)。
③基址寄存器B(由相应字段显式给出,可指定为任一通用寄存器)。
④变址寄存器I(由相应字段显式给出,可指定除ESP外的任一通用寄存器)。