电子常识
形成操作数或指令地址的方式,称为寻址方式。8086有七种寻址方式:立即数寻址方式 、寄存器寻址方式 、直接寻址方式 、寄存器间接寻址方式 、寄存器相对寻址方式 、基址变址寻址方式 、相对基址变址寻址方式。
操作数作为指令的一部分存放在操作码之后的内存单元中这种操作数被称为立即数
8位数值(00H~FFH)
16位数值(0000H~FFFFH)
立即数寻址方式常用来给寄存器赋值
有效地址(EA)=位移量(disp)+基址(base)+变址(index)
位移量:存放在指令中的数,但它不是立即数,而是一个地址,可以用变量或标号表示。
基址:存放在基址寄存器(BX、BP)中,有效地址的基址部分。
变址:存放在变址寄存器(SI、DI)中,有效地址的变址部分。
8086允许程序员用段跨越前缀来改变系统所指定的默认段,如:允许数据存放在DS以外的段中,使用时指明段前缀,但是有些情况是不可以修改的。
(1)串处理操作中目的串必须用ES段,即默认为ES:DI,不可修改。
(2)压栈(push)、弹栈(pop)必须使用SS段,即默认为SS:SP不可修改。
(3)指令必须存放在CS段中。
操作数的地址中的偏移量直接跟在操作码之后,默认情况下基址存放在DS中,这个时候不需要加前缀,如果是加了别的前缀,如ES,则表示基址在ES中。
例如:
movax,[4000h]
movax,value (如果我们在前面定义了“符号地址”value=4000h,那么这句和上面的是一样的)
data segment
W dw 4
X dw 5
Y dw 1
data ends
这里的 W,X,Y就是符号地址,它代表变量的在段中偏移量。
这个时候我们就可以使用:
MOV AX, W
这里表示的W表示的就是偏移量,所以属于直接寻址。
有效地址在寄存器SI/DI/BX/BP中
若在SI、DI、BX中,则操作数默认在数据段
若在BP中,则操作数默认在堆栈段
操作数在存储器中,而其有效地址存放在某个寄存器中,可用寄存器有 BX、BP、SI、DI。
区别于寄存器寻址,前者操作数存放在寄存器中,在指令中存放相应的寄存器号码,不需要访存;后者的寄存器存放操作数的有效地址,而操作数本身在存储器中。指令要先通过该寄存器获取操作数有效地址,在通过该地址访存获取操作数。
同样也可以为其指定其他段前缀。
图形示意:
代码示意:
mov ax,[bx] ;假设 (ds) = 2000H,(bx) = 1000H ,则执行结果为:(ax) = (21000) ,即取出存储单元 21000H-21001H 位置的值赋给 ax
对于BX寄存器来说,使用DS作为基址寄存器。例如:
mov ax,count[bx] 或 movax, [count+bx] ------DS基址,上面2条指令作用是相同的。
对于BP寄存器来说,使用SS作为基址寄存器。
例如:
mov ax,count[bp] 或 movax, [count+bp] ------SS基址
使用2个变址寄存器si,di.例如:
movax, count[si] 或 mov ax,[count+si]
movax, count[di] 或 mov ax,[count+di]
最后的物理地址计算总体是这样的:
物理地址=16D*(DS)+(BX)+8
或(SI)或16位位移量
或(DI)
物理地址=16D*(SS)+(BP)+8位位移量
或16位位移量
操作数有效地址等于基址寄存器与变址寄存器内容之和,可使用寄存器有 BX、BP、SI、DI。
有效地址(EA)= 基址 + 变址。
图形示意:
代码示意:
mov ax, [bx][di]/[bx+di] ;假设 (ds) = 2100H ,(bx) = 0158H ,(di) = 10A5H ,则执行结果为:(ax) = (221FDH),即取出存储单元 221FDH-221FEH 位置的值赋给 ax
有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
EA=[BX]/[BP]+[SI]/[DI]+8/16位位移量
全部0条评论
快来发表一下你的评论吧 !