操作数或指令地址形成的方式称为寻址模式。8086有七种寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式和相对基址变址寻址方式。
1)立即寻址模式的操作数作为指令的一部分存储在操作码之后的存储单元中。这个操作数称为立即数。
8位值(00H~FFH)
16位数值(0000H~FFFFH)
立即寻址通常用于给寄存器赋值。
2)寄存器寻址模式1。有效地址有效地址(EA)=位移(disp)基址(索引)
位移:存储在指令中的数字,但不是立即数,而是地址,可以用变量或标签来表示。
基址:存储在基址寄存器(BX,BP)中的有效地址的基址部分。
变址:存储在变址寄存器(SI,DI)中的有效地址的变址部分。
2.使用段前缀的规则8086允许程序员通过将前缀与段交叉来更改系统指定的默认段,例如允许数据存储在DS以外的段中,并在使用时指明段前缀,但在某些情况下不能修改。
(1)在字符串处理操作中,目的字符串必须使用ES段,即默认值为ES:DI,不可修改。
(2)推送和弹出必须使用SS段,即SS:SP默认不可修改。
(3)指令必须存储在CS部分。
3)直接寻址操作数地址中的偏移量直接跟在操作码后面。默认情况下,基址存储在DS中,此时不需要添加前缀。如果添加了另一个前缀,如ES,则表示基址在ES中。
例如:
movax,[4000h]
Movax,value(如果我们在前面定义了“符号地址”value=4000h,那么这句话同上)。
数据段
宽dw 4
X dw 5
Y dw 1
数据结束
其中w,x,y是符号地址,代表段中变量的偏移量。
这时,我们可以用:
MOV AX,W
这里的w代表偏移量,所以属于直接寻址。
4)寄存器间接寻址模式的有效地址在寄存器SI/DI/BX/BP中。
如果是SI、DI和BX,操作数默认为数据段。
如果在BP中,操作数默认为堆栈部分。
操作数在内存中,它的有效地址存储在寄存器中。可用的寄存器有BX、BP、SI和DI。
与寄存器寻址不同,前一个操作数存储在寄存器中,对应的寄存器号存储在指令中,不需要访问;后者的寄存器保存操作数的有效地址,操作数本身在内存中。指令必须首先通过这个寄存器获得操作数的有效地址,然后通过这个地址访问存储器获得操作数。
您也可以为其指定其他段前缀。
图形指示:
代码指示:
mov ax,[bx];假设(ds)=2000H,(bx)=1000H,则执行结果为:(ax)=(21000),即取出存储位置21000H-21001H的值赋给ax。
5)寄存器的相对寻址方式
(1)基址的相对寻址对于BX寄存器,DS用作基址寄存器。例如:
Mov ax,Count [BX]或movax,[count[bx]]-DS基址,以上两条指令的作用相同。
对于BP寄存器,SS用作基址寄存器。
例如:
Mov ax,Count [BP]或movax,[count[bp]]-SS基址。
(2)索引相对寻址使用两个索引寄存器si、di。例如:
Mov ax,count [si]或movax,[count[si]]
Mov ax,count [di]或movax,[count[di]]
最终的物理地址计算如下:
物理地址=16D*(DS) (BX) 8
或(SI)或16位位移。
或(DI)
物理地址=16D*(SS) (BP) 8位位移
或16位位移
6)基址变址寻址模式下操作数的有效地址等于基址寄存器和变址寄存器的内容之和,可用的寄存器有BX、BP、SI和DI。
有效地址(EA)=基址索引。
图形指示:
代码指示:
mov ax,[bx][di]/[bx di];假设(ds)=2100H,(bx)=0158H,(di)=10A5H,则执行结果为:(ax)=(221FDH),即取出存储单元221FDH-221FEH的位置值并赋给ax。
7)相对于基址索引寻址模式的有效地址是基址寄存器(BX/BP)、索引寄存器(SI/DI)和8位或16位位移的总和:
EA=[BX]/[BP]+[Si]/[DI]+8/16排量。
标签:地址器基址