zoukankan      html  css  js  c++  java
  • 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
    (存储单元的地址可用存储器寻址方式得到)

    例:

     

     

     

     

     

  • 相关阅读:
    Azkaban的使用
    Azkaban安装
    Kafka 启动失败,报错Corrupt index found以及org.apache.kafka.common.protocol.types.SchemaException: Error reading field 'version': java.nio.BufferUnderflowException
    Kafka 消费者设置分区策略及原理
    Kafka利用Java API自定义生产者,消费者,拦截器,分区器等组件
    zookeeper群起总是有那么几个节点起不来的问题解决
    flume 启动agent报No appenders could be found for logger的解决
    Flume 的监控方式
    Flume 自定义 组件
    Source r1 has been removed due to an error during configuration java.lang.IllegalArgumentException: Required parameter bind must exist and may not be null & 端口无法连接
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11049897.html
Copyright © 2011-2022 走看看