• 166.寻址方式


    8086的寻址方式

    1.与数据有关的寻址方式

    以 MOV 指令为例

                            立即寻址 MOV AX , 3069H
      寄存器寻址 MOV AL , BH

    存储器寻址

    直接寻址 MOV AX , [ 2000H ]
    寄存器间接寻址 MOV AX , [ BX ] 
    寄存器相对寻址 MOV AX , COUNT [ SI ] 
    基址变址寻址 MOV AX , [ BP ] [ DI ]
    相对基址变址寻址 MOV AX , MASK [ BX ] [ SI ]

    1.1立即寻址方式*

    —— 操作数在指令中给出

    指令格式:

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

    * 只能用于 SRC 字段      MOV 40H, AL    //F

    * SRC 和 DST 的字长一致    MOV AH, 3064H    //F

    1.2寄存器寻址方式*

    — 操作数在指定的寄存器中

    MOV AX, BX
    MOV AL, BH
    MOV AX, 3064H

    * 字节寄存器只有 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
    (存储单元的地址可用存储器寻址方式得到)

    例:

     

     

     

     

     

  • 相关阅读:
    SocketChannel 例子(转)
    多态(Polymorphism)的实现机制(上)--C++篇
    多态(Polymorphism)的实现机制(下)--Java篇
    java volatitle 多线程问题
    线程BlockingQueue (转)
    java 多态,和方法覆盖分析(转)
    MFC 调试技巧
    strlen与sizeof区别(转载)
    杭电1048
    杭电2013
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11049897.html
Copyright © 2020-2023  润新知