8086 七种寻址方式

时间:2021-03-20 07:59:56

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>寄存器相对寻址方式

8086 七种寻址方式

(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]