166.尋址方式

8086的尋址方式數組

1.與數據有關的尋址方式

以 MOV 指令爲例oop

                        當即尋址 MOV AX , 3069H
  寄存器尋址 MOV AL , BH

存儲器尋址post

直接尋址 MOV AX , [ 2000H ]
寄存器間接尋址 MOV AX , [ BX ] 
寄存器相對尋址 MOV AX , COUNT [ SI ] 
基址變址尋址 MOV AX , [ BP ] [ DI ]
相對基址變址尋址 MOV AX , MASK [ BX ] [ SI ]

1.1當即尋址方式*

—— 操做數在指令中給出spa

指令格式:code

MOV AL, 5
MOV AX, 3064H
MOV AL, ‘A’blog

* 只能用於 SRC 字段      MOV 40H, AL    //F字符串

* SRC 和 DST 的字長一致    MOV AH, 3064H    //Fget

 

1.2寄存器尋址方式*

— 操做數在指定的寄存器中string

MOV AX, BX
MOV AL, BH
MOV AX, 3064Hit

* 字節寄存器只有 AH AL BH BL CH CL DH DL
* SRC 和 DST 的字長一致 MOV AH, BX    //F
* CS 不能用 MOV 指令改變 MOV CS, AX   //F

 


 

 操做數的偏移地址:有效地址EA(effective address)

*有效地址計算

  EA = 基址 + (變址*比例因子)+ 位移量

  16位尋址 32位尋址
位移量 0,8,16位 0,8,32位
基址寄存器 BX,BP 任何32位通用寄存器包括ESP
變址寄存器 SI,DI 任何32位通用寄存器除ESP
比例因子 1,2,4,8

不容許跨段前綴:

串處理指令的目的串必須用ES段

PUSH和POP指令的源必須用SS段

指令必須放在CS段

物理地址:PA


 

1.3直接尋址方式*

— 有效地址EA由指令直接給出

例:MOV AX, [ 2000H ]
EA=2000H, 假設(DS)=3000H, 那麼PA=32000H

* 隱含的段爲數據段 DS
* 可以使用段跨越前綴 MOV AX, ES: [2000H]

* 操做數地址可由變量(符號地址)表示, 但要注意變量的屬性

VALUE DB 10
MOV AH, VALUE
MOV AX, VALUE //F
MOV AX, WORD PTR VALUE //T

 

1.4寄存器間接尋址*

— EA 在基址寄存器(BX/BP)或變址寄存器(SI/DI) 中

MOV AX, [BX]   PA = 16d × (DS) + (BX)
MOV AX, ES:[BX]   PA = 16d × (ES) + (BX)
MOV AX, [BP]   PA = 16d × (SS) + (BP)

* 不容許使用AX、CX、DX 存放 EA
MOV AX, [CX]   //F
* SRC 和 DST 的字長一致
MOV DL, [ BX ] ; [BX]指示一個字節單元
MOV DX, [ BX ] ; [BX]指示一個字單元
* 適於數組、字符串、表格的處理

 

1.5寄存器相對尋址方式*

 

指令格式: MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI]
假設 (DS)=3000H, (SI)=2000H, COUNT=3000H,
則: PA = 35000H
假設(35000H)=1234H, 那麼 (AX)=1234H
* 適於數組、字符串、表格的處理

 

1.6基址變址尋址方式*

 

指令格式:

MOV AX, [BX] [DI]
MOV AX, [BX+DI]
MOV AX, ES:[BX] [SI]

* 適於數組、字符串、表格的處理
* 必須是一個基址寄存器和一個變址寄存器的組合
MOV AX, [BX] [BP]  //F
MOV AX, [SI] [DI] //F

 

1.7相對基址變址尋址方式

 

MOV AX, MASK [BX] [SI]
或 MOV AX, MASK [BX+SI]
或 MOV AX, [MASK+BX+SI]

 

1.8段寄存器的使用規定

 

例:編寫一段顯示字符串STRING的程序
DATA SEGMENT
STRING DB ‘ HAPPY NEW YEAR! ’, 0DH , 0AH , ‘ $ ’
COUNT DW 17
DATA ENDS

( 1 ) 直接尋址

          mov   dl,  string                
          mov   ah, 2              
          int      21h                       ; 顯示字符‘H’

          mov   dl, string+1                    
          mov   ah, 2
          int      21h                       ; 顯示字符‘A’
           :
           :

 

( 2 ) 寄存器間接尋址

            mov    cx,  count                   ; mov  cx, 17         
            mov    bx,  offset  string        ; string的偏址 給 bx
Next :      mov   dl,   [bx]                     
            mov    ah,   2
            int       21h                             ; 顯示一個字符
            inc      bx
            loop   next                             ; 循環指令

 

( 3 ) 寄存器相對尋址

            mov  cx,  count                  ; mov  cx, 17      
            mov  si,   0                         
Next :      mov  dl,   string[si]             ; mov  dl,  [string+si] 
            mov  ah,  2
            int     21h                           ; 顯示一個字符
            inc     si
            loop   next                         ; 循環指令

( 4 ) 基址變址尋址

            mov     cx,  count                   ; mov  cx, 17  
            mov     bx,  offset  string        ; string的偏址  bx
            mov     si,   0
Next :      mov    dl,  [bx] [si]                  ; mov  dl, [bx+si] 
            mov     ah, 2
            int       21h                              ; 顯示一個字符
            inc       si
            loop     next                            ; 循環指令

 

( 5 ) DOS 顯示字符串功能

            mov     dx, offset  string        ; string的偏址  dx
                                             ; lea  dx, string
            mov     ah, 9
            int     21h                    ; 顯示一串字符

 1.9 80x86 新增的尋址方式

EA= (基址寄存器) + (變址寄存器) × 比例因子 + 位移量

( 1 ) 比例變址尋址方式
例:MOV EAX, COUNT [ ESI * 4 ]

 

(2) 基址比例變址尋址方式
例:MOV ECX, [ EAX ][ EDI * 4 ]
(3) 相對基址比例變址尋址方式
例:MOV EAX, TABLE [ EBP ][ EDI * 4 ]

 

 

 2.與轉移地址有關的尋址方式

用來肯定轉移指令及轉子指令的轉向地址

段內尋址

段內直接尋址     JMP    NEAR PTR  NEXT 
段內間接尋址

JMP TABLE [ BX ]

段間尋址

段間直接尋址     JMP    FAR PTR  NEXT 
段間間接尋址    

JMP DWORD PTR [ BX ]

2.1段內直接尋址

 

例:

JMP NEAR PTR NEXT 近轉移 -32768 ~ +32767
JMP SHORT NEXT 短轉移 -128 ~ +127

 

 2.2段內間接尋址

轉向的有效地址是一個寄存器或存儲單元的內容。
(可用除當即數之外的任何一種數據尋址方式獲得)

例: TABLE = 20A2H     (BX) = 1256H              (SI) = 528EH
        (DS) = 2000H         (232F8H) = 3280H      (264E4H) = 2450H

              JMP  BX                                ; (IP)=1256H
              
              JMP  TABLE[BX]
              JMP  WORD PTR  TABLE[BX]               ; (IP)=3280H
              ;20A2+1256=32f8  +  20000  =  232F8
JMP [BX][SI] JMP WORD PTR [BX][SI] ; (IP)
=2450H

 

 2.3段間直接尋址

用指令中提供的轉向段地址和偏移地址取代CS 和 IP

 例:

 

2.4段間間接尋址

用存儲器中的兩個相繼字的內容取代CS 和 IP
(存儲單元的地址可用存儲器尋址方式獲得)

例:

 

 

 

 

相關文章
相關標籤/搜索