一条指令由操作码和操作数构成,操作码是系统定义好的符号,执行指定的操作,操作数即是指令的对象,而寻址方式就是操作数的指定方式
操作码 目的操作数,源操作数
(1)CPU中(2)储存器(3)I/O中
(1)隐含寻址:
指令中只有操作码没有指定的操作数,但是根据操作码就可确定相应的操作数
MUL BL;
DIV BL;
(2)立即寻址:
指令中直接给出要操作的数
ADD AL,50
立即寻址只能用在源操作数上
(3)寄存器寻址:
A、指令中给出寄存器的名字,寄存器中的内容是要操作的数,这种方式称为寄存器寻址。
B、可以使用寄存器:8个通用16位寄存器(AX,BX,CX,DX,SI,DI,BP,SP),以及8个8位寄存器(AH,AL,BH,BL,CH,CL,DH,DL)
ADD AL,BL
(4)段寄存器寻址:
A、指令中给出段寄存器的名字,段寄存器中的内容是要操作的数,这种方式称为段寄存器寻址。
B、可以使用段寄存器:4个段寄存器(CS,DS,ES,SS)
C、8086中只有数据传输指令MOV,堆栈操作指令PUSH和POP可以使用段寄存器寻址方式
(5)I/0口寻址
A、操作数在I/O接口中,这种寻址方式为I/O寻址
B、只用使用IN/OUT操作。
C、直接IO寻址:使用一个8位无符号数指定端口号
间接IO寻址:使用一个16位寄存器DX来指定端口号
(6)转移地址的寻址:
指令指针IP会一直指向下一条要执行的命令,所以使用指令转移IP内容,成为转移地址的寻址
(7)储存器操作数的寻址
①概念:
8086CPU有20根地址线,所以储存器每个单元的地址是20位(2进制),称为物理地址,而CPU内部的寄存器都是16位,只用一个寄存器不能完整表示储存器地址,所以拆成2个分量:段地址(CS,DS,ES,SS),偏移地址(BX,BP,SI,DI)
物理地址 = 段地址*10H + 偏移地址
②直接寻址
ADD AL,[Xvar]
将Xvar地址中的内容与AL相加,并储存在AL中;其中Xvar是在数据段中定义的一个变量名
A、直接寻址:要用变量名指定地址
立即寻址:常数作为源操作数
ADD AL,[20H]
认为是立即寻址
③寄存器间接寻址
A、将储存器的偏移地址存在一个16位寄存器中,然后用方括号中的16位寄存器指定此偏移地址,成为寄存器间接寻址
B、BX,SI,DI搭配DS(数据段)
BP搭配SS(堆栈段)
ADD AL,[BX]; 从数据段的此地址取数据
ADD AL,[BP]; 从堆栈段的此地址取数据
④寄存器相对寻址
A、就是在寄存器间接寻址的基础上,使用BX+D(8位或者16位的常数偏移量)作为地址
ADD AL [SI+5]; ADD AL [BP-5];
⑤基址变址寻址
A、将一个基址寄存器(BX,BP)与一个变址寄存器(SI,DI)的内容相加作为偏移地址,段寄存器搭配由基址寄存器决定:BX搭配DS,BP搭配SS
B、计算公式:
物理地址=DS*10H+BX/DP+SI/DI
C、指令
ADD AL,[BX+SI]; 只能相加 ADD AL,[BP-DI]; 不能相减 ADD AL [BX+BP]; 也不能是两个基址寄存器 ADD AL,[SI+DI]; 或者是两个变址寻址器
⑥相对基址变址寻址
A、就是在寄存器基址变址寻址的基础上,使用BX+SI+D(8位或者16位的常数偏移量)作为地址
ADD AL,[BP+BI+5] ADD AL,[BP+BI-5]; 同样的,不能有减法
原文:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4979813.html