三、8086CPU的寻址方式
1、与数据有关的寻址方式(主要在数据段内找数据)
(1)立即寻址:数据在指令内以立即数形式存在
示例:MOV AX,05H (其中05H即为立即数)
操作限制:注意立即数的表数范围,不要超范围
立即数不可作为目的操作数
(2)寄存器寻址:数据存放在寄存器内
示例:MOV AX,BX (源操作数BX和目的操作数AX均为寄存器寻址)
操作限制:注意源操作数和目的操作数的格式匹配,即均为8位或均为16位
有些寄存器不允许作为目的操作数,例如:CS、DS、ES、SS、IP
(3)直接寻址:指令中给出数据的有效地址
示例:MOV AX,[2000H] (2000H即为偏移地址,加方括号和立即数区别)
MOV AX,TABLE (TABLE为符号地址名,对应相应的偏移地址值)
MOV AX,ES:[2000H] (允许段跨越形式,SS、CS亦可以,默认为DS)
操作限制:双操作数至少有一个为寄存器形式,不允许都为直接寻址
主存操作的高高低低原则
(4)寄存器间接寻址:数据的有效地址放在寄存器中
示例:MOV AX,[BX] (BX内为偏移地址,加方括号和寄存器寻址区别)
MOV [BP] ,AX (源和目的均可以)
操作限制:只有BX、BP、SI和DI可以使用,其它寄存器不允许
用BX、SI和DI时,是在数据段,以DS为基地址寄存器
用BP时,是在堆栈段,以SS为基地址寄存器
(5)寄存器相对寻址:在寄存器间址的基础上,再加上相对偏移量
示例:MOV AX,TABLE[BX] (符号地址TABLE即为相对偏移量)
MOV 50H[BP] ,AX (相对量也可以是立即数,立即数为补码)
注意:寄存器的值加上相对偏移量的值,二者之和为最后的偏移地址
相对量可以是补码,位数不匹配,计算机自动完成位扩展,即正数前补0,负数前补1
操作限制:只有BX、BP、SI和DI可以使用,其它寄存器不允许
用BX、SI和DI时,是在数据段,以DS为基地址寄存器
用BP时,是在堆栈段,以SS为基地址寄存器
实质上可以构成一个一维数组
(6)基址变址寻址:基址寄存器和变址寄存器的值相加,和为偏移地址
示例:MOV AX,[BX][SI] (两寄存器均加方括号)
MOV AX,[BX + SI] (也可这样书写)
注意:基址寄存器只有BX和BP,变址寄存器只有SI和DI,二者排列组合只有四种形式
操作限制:只有BX、BP、SI和DI可以使用,其SI和DI是配合使用
用BX时,是在数据段,以DS为基地址寄存器
用BP时,是在堆栈段,以SS为基地址寄存器
(7)相对基址变址寻址:上述(5)和(6)的组合使用
示例:MOV AX,TABLE[BX][SI] (基址、变址再加上相对量)
MOV AX,[BX + SI + TABLE] (也可这样书写)
操作限制:用BX时,是在数据段,以DS为基地址寄存器
用BP时,是在堆栈段,以SS为基地址寄存器
实质上可以构成一个二维数组
2、与转移地址有关的寻址方式(主要在代码段内找指令)
(1)段内直接寻址:段基址不变,指令直接给出地址偏移量(数值为补码)
注意:不是偏移地址值
汇编程序计算当前指令与目的地址之间的相对偏移量,向后跳IP加正值,向前跳IP加负值(即减值)
示例:JMP SHORT TABLE (TABLE为跳转的目的地址,SHORT标识为短跳,即8位偏移量)
JMP NEAR PTR TABLE (PTR为属性指针,NEAR标识16位偏移量)
注意:8位偏移量范围为-128—127,即IP最大加127,最小减128
16位偏移量范围为-32768—32767,即IP最大加32767,最小减32768
以上为IP的转移范围
操作限制:条件转移时,仅允许8位偏移量
只用符号地址形式,不允许直接给地址值
(2)段内间接寻址:段基址不变,用其它的寻址方式找出一个地址值(16位)放入IP
示例:JMP BX (把BX寄存器的值放入IP)
JMP WORD PTR [SI] (以寄存器SI的值为地址,取出一个字放入IP)
操作限制:除立即寻址外,其它寻址方式均可以(直接寻址方式即上述的段内直接寻址)
(3)段间直接寻址:给出的符号地址与跳转指令不在一个段内,段基址需要改变
示例:JMP FAR PTR TABLE (FAR标识TABLE在另一个段内)
操作时把TABLE所在段的段基址放入CS,把TABLE的段内偏移地址放入IP
(4)段间间接寻址:用其它的寻址方式找出一个双字,低位放入IP,高位放入CS
示例:JMP DWORD PTR [SI]
以寄存器SI的值为地址,取出一个双字,低字放入IP,高字放入CS
操作限制:立即寻址、寄存器寻址和直接寻址方式除外,其它寻址方式均可以