大多数指令有一个或多个操作数,指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。IA32 支持的操作数格式:
1)立即数(imm,常数值),在 ATT 格式的汇编中,书写方式是‘$’ 后面跟一个用标准 C 表示法表示的整数。
2)寄存器,它表示某个寄存器的内容。用符号Ea来表示任意寄存器 a,用引用 R[Ea] 来表示它的值,这是将寄存器集合看成一个数组 R,用寄存器标识符作为索引。
3)存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。因为将存储器看成一个很大的字节数组,用符号Mb[Addr]表示对存储在存储器中从地址Addr 开始的 b 个字节值的引用。为了方便,通常省去下方的 b。
如下图所示,有很多不同的寻址方式,允许不同形式的存储器引用。表中底部用语法 Imm(Ea, Eb, s) 表示的是最常用的形式。这样的引用有四个组成部分:一个立即数偏移 Imm, 一个基址寄存器 Eb , 一个变址寄存器 Ei和一个比例因子 s,这里 s 必须是 1、 2、 4 或者 8。然后,有效地址被计算为 Imm + R[] + R[] * s。应用数组元素时,会用到这种通用形式。其他形式都是通过通用形式的特殊情况,只是省略了某些部分。当引用数组和结构元素时,比较复杂的寻址模式是很有用的。
类型 |
格式 |
操作数值 |
名称 |
立即数 |
$Imm |
Imm |
立即数寻址 |
寄存器 |
Ea |
R[Ea] |
寄存器寻址 |
存储器 |
Imm |
M[Imm] |
绝对寻址 |
存储器 |
(Ea) |
M[R[Ea]] |
间接寻址 |
存储器 |
Imm(Ea) |
M[Imm + R[Ea]] |
(基址+偏移量) 寻址 |
存储器 |
(Eb, Ei) |
M[R[Eb] + R[Ei]] |
变址寻址 |
存储器 |
Imm(Eb, Ei) |
M[R[Eb]+R[Ei]+Imm] |
变址寻址 |
存储器 |
(, Ei, s) |
M[R[Ei]*s] |
比例变址寻址 |
存储器 |
Imm(, Ei, s) |
M[Imm + R[Ei]*s] |
比例变址寻址 |
存储器 |
(Eb, Ei, s) |
M[Eb + Ei * s] |
比例变址寻址 |
存储器 |
Imm(Eb, Ei, s) |
M[Imm+E[Eb]+E[i]*s] |
比例变址寻址 |
对于寻址方式的理解:
寻址方式就是寻找操作数或操作数地址的方式。8086提供了与操作数有关和与I/O端口地址有关的两类寻址方式。与操作数有关的寻址方式有七种,分别是立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址加变址寻址,相对基址加变址寻址;与I/0端口有关的寻址方式有直接端口寻址和间接端口寻址方式。另外还有隐含寻址,即把要寻找的地址包含在操作码中。
目录
基址寻址:在基址寻址中,有效地址由两部分组成。一部分在基址寄存器中,另一部分为常量 。
① 基址寻址的地址表达式:
段寄存器:[基址寄存器+位移量]
或 段寄存器: 位移量[基址寄存器]
物理地址=段寄存器内容×16+基址寄存器+位移量
② 访问约定的逻辑段,简化的地址表达式:
[基址寄存器+位移量]
物理地址=约定的段寄存器内容×16+基址寄存器+位移量
变址寻址:
① 有比例因子的变址寻址其地址表达式为
段寄存器:[比例因子*变址寄存器+位移量]
或 段寄存器: 位移量[比例因子*变址寄存器]
② 物理地址=段寄存器×16+比例因子×变址寄存器+位移量
没有比例因子的变址寻址其地址表达式为:
段寄存器:[变址寄存器+位移量]
访问约定的逻辑段可简化为 :
[变址寄存器+位移量]
物理地址=约定的段寄存器×16+变址寄存器+位移量
参考来源:http://baike.baidu.com/view/889427.htm