2 80x86的指令系统和寻址方式
2.1 80x86的寻址方式
指令:操作码字段 + 操作数字段
操作码字段指示计算机所要执行的操作,操作数字段指出指令执行操作的过程中所需要的操作数
2.1.2 与数据相关的寻址方式
与数据相关的寻址方式是用来确定操作数地址从而找到操作数
2.1.2.1 立即数寻址方式
1) 操作数直接放在指令中,紧跟在操作码之后。作为指令的一部分存放在代码段里
2) 用来表示常数,经常用于给寄存器赋值
3) 只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应该与目的操作数长度一致
4) Mov AL,5 à (AL) = 05H
2.1.2.2 寄存器寻址方式
1) 操作数在寄存器中,指令指定寄存器号。
2) 操作数就在寄存器中,不需要访问存储器取得操作数,因而有较高的运算速度
3) Mov AX,BX ( (BX) = 05H ) à (AX) = 05H BX内容保持不变
2.1.2.3 直接寻址方式
1) 操作数的有效地址,只包含位移量。存放在代码段 中指令的操作码之后
2) 适用于处理单个变量
3) Mov AX , [2000H]
2.1.2.4 存储器间接寻址方式
1) 有效地址存储在某个寄存器中,操作数在存储器中
2) 用于表格处理,执行完一条指令之后,只需要修改寄存器内容就可以取出表格的下一项
3) (DS) = 2000H, (BX) = 1000H mov AX,[BX] à物理地址 = 20000+1000
2.1.2.5 寄存器相对寻址方式
1) 有效地址由两种成分组成,详见 表2.3
2) 可用于表格处理,表格的首地址可设置为位移量,利用修改基址或变址寄存器的内容来取得表格中的值
3) 物理地址(PA) = 基址 + 变址 + 位移量
2.1.2.6 基址变址寻址方式
1) 有效地址由两部分组成,详见 表2.3
2) 适用于数组或者表格处理,首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素,两个寄存器都可修改
3) Mov AX, [BX][DI] ( == Mov AX, [BX + DI])
(DS) = 2100H, (BX) = 0158H, (DI) = 10A5H
è EA = 0158 + 10A5 = 11FDH PA= 21000 + 11FD = 221FDH
4) 使用段跨越前缀时的格式: mov AX, ES : [BX][SI]
2.1.2.7 相对基址变址寻址方式
1) 有效地址由三部分组成。详见表2.3
2) 常用于对二维数组的寻址
3) Mov AX, MASK [BX] [SI]
等同于 MOV AX , MASK[BX + SI] 或 MOV AX, [MASK + BX + SI]
(DS)= 3000H , (BX) = 2000H , (SI) = 1000H ,MASK = 0250H
PA = 16d * (DS) + (BX) + (SI) + MASK
2.1.2.8 不常用寻址方式
1) 比例变址寻址方式
2) 基址比例变址寻址方式
3) 相对基址比例变址寻址方式
2.1.3 与转移地址有关的寻址方式
2.1.3.1 段内直接寻址
1) 转向的有效地址是当前IP 寄存器的内容和 指令中指定的 8位 或 16位位移量之和
2) 有效地址组成详见表2.4
3) 转移指令本身不会发生变化
4) 适用于条件及无条件转移指令,用于条件转移指令时,位移量只允许8位
5) 短跳转:无条件转移指令位移量为8位时 JMP NEAR PTR PROGIA
近跳转:无条件转移指令位移量为16位时 JMP SHORT QUEST
2.1.3.2 段内间接寻址
1) 有效地址组成详见表2.4
2) 有效地址的获取,不能使用立即数寻址方式,其他的都可以
3) 不能用于条件转移指令,条件指令转移条件只能使用段内直接寻址的8位位移量
4) JMP 和CALL 指令则可用四种寻址方式中的任何一种
5) JMP BX
JMP WORD PTR [BP + TABLE]
6) (DS) = 2000H ,(BX) =1256H ,(SI)= 528FH ,位移量 = 20A1H,(232F7H)=3280H
JMP BX à (IP) = 1256H
JMP TABLE[BX] à (IP)= (16d * (DS) + (BX) + 位移量)
2.1.3.3 段间直接寻址
1) 在指令中直接提供转向段地址,偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容,就完成了从一个段到另一个段的转移操作
2) JMP FAR PTR AB
2.1.3.4 段间间接寻址
1) 用存储器的两个相继字的内容,取代IP,CS寄存器中的原始内容
2) 存储单元的地址是由指令指定 除立即数和寄存器方式以外的任何一种数据寻址方式
3) JMP DWORD PTR [A + BX]
2.1.3.5 有效地址
1) 偏移地址 = 有效地址
2) 有效地址可以由以下四种成分组成
a) 位移量,存放在指令中的一个数,不是立即数,是地址
b) 基址,存放在基址寄存器中的内容。是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址
c) 变址,存放在变址寄存器中的内容。通常用来访问数组中的某个元素或字符串中的某个字符
d) 比例因子,其值可为1,2,4或8。可用变址寄存器中的内容乘以比例因子来取得变址值。对访问元素长度为2,4,8字节的数组特别有用
e) EA = 基址+ (变址 * 比例因子) + 位移量 比例因子是固定值
表2.1 16/32位寻址时有效地址四种成分的组成
四种成分 | 16位寻址 | 32位寻址 |
位移量 | 0,8,16位 | 0,8,32位 |
基址寄存器 | BX,BP | 任何32位通用寄存器(包括ESP) |
基址寄存器 | SI,DI | 除ESP以外的32位通用寄存器 |
比例因子 | 无 | 1,2,4,8 |
2.1.3.6 以下几种情况不允许使用段超越前缀
1) 串处理指令的目的串必须用ES段
表2.2默认段选择规则
访问类型 | 所用段及段寄存器 | 缺省选择规则 |
指令 | 代码段 CS | 用于取指 |
堆栈 | 堆栈段 SS | 所有的堆栈的进栈和出栈 任何用ESP或EBP作为基址寄存器的访存 |
局部数据 | 数据段 DS | 除相对于堆栈以及串处理的目的串 |
2.1.3.7 “与数据相关的寻址方式”总结
1) 没有有效地址(EA)的:寄存器寻址方式、立即数寻址方式
2) 各个寻址方式有效地址的组成:
表 2.3 各个寻址方式有效地址的组成
寻址方式 | 有效地址组成 | 备注 |
寄存器寻址方式 | 无 |
|
立即数寻址方式 | 无 |
|
直接寻址方式 | 位移量 |
|
寄存器间接寻址方式 | 基址寄存器内容 或 变址寄存器内容 |
|
寄存器相对寻址方式 | 基址寄存器 或 变址寄存器 和 指令中的位移量之和 |
|
基址变址寻址方式 | 一个基址寄存器 和 一个变址寄存器 的内容之和 |
|
相对基址变址寻址方式 | 一个基址寄存器 和 一个变址寄存器的内容与 指令中指定的位移量之和 |
|
3) 与转移地址有关的寻址方式的有效地址的组成
表2.4 与转移地址有关的寻址方式的有效地址的组成
寻址方式 | 有效地址组成 | 备注 |
段内直接寻址 | 当前IP值的位移量 (取代IP寄存器中的内容) | 相对寻址方式 位移量 = 转向的EA – 当前IP值 |
段内间接寻址 | 一个寄存器 或 一个存储单元的内容(取代IP寄存器中的内容) | 除立即数寻址以外的任何一种方式 |
|
|
|
|
|
|
4) 8086中为了使指令字不要过长,规定双操作数指令的两个操作数中,只有一个使用存储器存储方式 ,这就是一个变量通常先送到寄存器的原因
5) 条件指令转移条件只能使用段内直接寻址的8位位移量