指令寻址
文章目录
一、指令寻址的定义
一条指令执行后,确定执行的下一条指令的位置。
IA-32 处理器设计有相对 、直接和间接3种指明目标地址的方式,其基本含义类似于对应的存储器数据寻址方式。
二、转移范围
程序流程的控制转移:
- 程序代码在代码段
- CS:指明代码段在主存中的段基地址
- EIP:给出将要执行指令的偏移地址
- 指令顺序寻址,程序顺序执行 ►处理器自动增量EIP
- 指令跳转寻址,程序控制转移 ►EIP(CS)随之改变
程序转移的范围(远近)在 IA-32 处理器中有段内和段间两种。
(1)段内转移
- 段内转移是指在 前代码段范围内的程序转移.因此不需要更改代码段寄存器 CS 的内容,只要改变指令指针寄存器 EIP 的偏移地址.
- 段内转移相对较近,故也被称为近转移 (类型属性使用“
NEAR
”关键字) - 如果转移范围在127~-128字节之间, (位移量使用1个字节)又称为短转移(类型属性使用“
SHORT
”关键字)
(2)段间转移
- 段间转移是指程序从当前代码段跳转到另一个代码段,此时需要更改代码段寄存器 CS 的内容和指令指针寄存器 ElP 的偏移地址。
- 段间转移可以在整个存储空间内跳转、相对较远,故也被称为远转移(类型属性使用“
FAR
”关键字)
三、指令寻址方式
(1)顺序寻址
EIP自动增量指向下一条指令,顺序执行接着的下一条指令.
(2)跳转寻址
控制流程跳转(转移)到指定指令位置,实现程序分支、循环、调用等结构.
1.指令的相对寻址
相对寻址是指令代码提供目标地址相对于当前指令指针寄存器 EIP 的位移量,转移到的目标地址(转移后的 EIP 值)就是当前 EIP 值加上位移量
提供目标地址相对于当前指令指针EIP的位移量
目标地址(转移后的IP)=当前EIP+位移量
- 相对寻址都是段内转移:由于要基于同一个基地址计算位置, 所以相对寻址都是段内转移。
- 最常用、最灵活:一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,相对寻址也就无须改变转移地址,给操作系统的灵活调度提供了很大方便。
2.指令的直接寻址
直接寻址是指令代码直接提供目标地址:
目标地址=指令操作数
- 理论上直接寻址可以段内或段间转移
- IA-32只支持段间的直接转移
3.指令的间接寻址
间接寻址是指令代码指示寄存器或存储单元,目标地址来自寄存器或存储单元,是通过间接手段获得的。
- 寄存器间接寻址:用寄存器保存目标地址
-
存储器间接寻址:用存储单元保存目标地址