8086/8088 CPU寻址方式
<1> 立即寻址操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数,可以是8bit或者16bit。
例如:
MOV AL,12H
MOV AX,1234H
<2> 直接寻址
操作数的地址中的偏移量直接跟在操作码之后,默认情况下基址存放在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表示的就是偏移量,所以属于直接寻址。
<3>寄存器寻址
操作数在CPU的寄存器中,指令指定寄存器号,这种寻址速度快,它不需要访问存储器中的操作数,因为所有的操作数都在寄存器中。
16位时,可以使用ax,bx,cx,dx,bx,bp,si,di中的任何一个.
8位时,可以使用ah,al;bh,bl;ch,cl;dh,dl中的任何一个.
例如:
mov ds,ax
mov al,dh
<4> 寄存器间接寻址
操作数在存储器中,操作数有效地址在SI,DI,BX,BP这四个寄存器之一中,在一般情况下,如果有效地址在SI,DI和BX中,则以DS段寄存器之内容为段值。如果有效地址在BP中,则以SS段寄存器之内容为段值。
例如:
mov ax,[bx] 或 mov ax,[si]或 mov ax,[di]-----DS基址
mov ax,[bp]-----SS基址
<5>寄存器相对寻址方式
(1)基址相对寻址
对于BX寄存器来说,使用DS作为基址寄存器.例如:
mov ax,count[bx] 或 movax, [count+bx] ------DS基址,上面2条指令作用是相同的.
对于BP寄存器来说,使用SS作为基址寄存器.
例如:
mov ax,count[bp] 或 movax, [count+bp] ------SS基址
(2)变址相对寻址
使用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位位移量
<6>基址变址寻址
(BX) (SI)
即:EA= +
(BP) (DI)
例如:
movax,[bx][si] 或 movax,[bx+si] '原变址寻址
movax,[bx][di] 或 movax,[bx+di] '目的变址寻址
<7>相对基址变址寻址
(BX) (SI) 8bit
即:EA= + +
(BP) (DI) 16bit
EA=DS*16+BX+SI(或DI)+DISP(8位或16位偏移量)
EA=SS*16+BP+SI(或DI)+DISP(8位或16位偏移量)
例如:
movax, [bx+si+count]