寻址方式

寻址方式 –术语寻址模式指指令操作数的指定方式。寻址模式指定在实际执行操作数之前解释或修改指令地址字段的规则。

null

8086指令的寻址模式分为两类:

1) 数据寻址模式

2) 分支的寻址模式

8086内存寻址模式提供了对内存的灵活访问,允许您轻松访问变量、数组、记录、指针和其他复杂数据类型。好的汇编语言编程的关键是正确使用内存寻址模式。

汇编语言程序指令由两部分组成

am1 操作数的内存地址由两部分组成:

重要术语

  • 起始地址 内存段的长度。
  • 有效地址或偏移量 :通过添加三个地址元素的任意组合来确定偏移量: 位移、基底和指数。
    • 取代: 它是指令中给出的8位或16位立即数。
    • 基础 :基址寄存器、BX或BP的内容。
    • 索引 :索引寄存器SI或DI的内容。

根据8086微处理器指定操作数的不同方式,8086采用了不同的寻址方式。

寻址方式 8086微处理器所使用的功能如下所述:

  • 隐含模式: :在隐含寻址中,操作数在指令本身中指定。在这种模式下,数据长度为8位或16位,数据是指令的一部分。零地址指令采用隐式寻址方式设计。 am2
    Example:  CLC (used to reset Carry flag to 0)
  • 即时寻址模式(符号#): 在这种模式下,数据出现在指令的地址字段中。设计成单地址指令格式。 注: 立即模式的限制是常数的范围受到地址字段大小的限制。 图片[3]-寻址方式-yiteyi-C++库
    Example:  MOV AL, 35H (move the data 35H into AL register)
  • 注册模式: 在寄存器寻址中,操作数置于8位或16位通用寄存器之一。数据位于指令指定的寄存器中。 这里需要一个寄存器引用来访问数据。 am3
    Example: MOV AX,CX (move the contents of CX register to AX register)
  • 寄存器间接模式 :在这种寻址方式中,操作数的偏移量被放入指令中指定的任何一个寄存器BX、BP、SI、DI中。数据的有效地址位于指令指定的基址寄存器或索引寄存器中。 这里需要两个寄存器引用来访问数据。 am5 8086 CPU允许您使用寄存器间接寻址模式通过寄存器间接访问内存。
    MOV AX, [BX](move the contents of memory location s 
    addressed by the register BX to the register AX)
  • 自动索引(增量模式) :操作数的有效地址是指令中指定的寄存器的内容。访问操作数后,该寄存器的内容将自动递增,以指向下一个连续的内存位置。 (R1)+ . 这里需要一个寄存器引用、一个内存引用和一个ALU操作来访问数据。 例子:
    Add R1, (R2)+  // OR
    R1 = R1 +M[R2]
    R2 = R2 + d 

    用于在循环中单步遍历数组。R2–阵列的开始 D –元素的大小

  • 自动索引(递减模式) :操作数的有效地址是指令中指定的寄存器的内容。在访问操作数之前,该寄存器的内容会自动递减,以指向上一个连续的内存位置。 (R1) 这里需要一个寄存器引用、一个内存引用和一个ALU操作来访问数据。

    例子:

    Add R1,-(R2)   //OR
    R2 = R2-d
    R1 = R1 + M[R2] 

    自动递减模式与自动递增模式相同。这两种方法也可以用来实现一个栈,即push和pop。自动递增和自动递减模式对于实现“后进先出”数据结构非常有用。

  • 直接寻址/绝对寻址模式(符号[]): 操作数的偏移量在指令中以8位或16位位移元素的形式给出。在这种寻址模式下,数据的16位有效地址是指令的一部分。 在这里,访问数据只需要一次内存引用操作。

    am6

    Example:ADD AL,[0301]   //add the contents of offset address 0301 to AL
  • 间接寻址模式(符号@或()) :在此模式下,指令的地址字段包含有效地址的地址。这里需要两份参考资料。 获得有效地址的第一个参考。 访问数据的第二个参考。

    根据有效地址的可用性,间接方式有两种:

    1. 寄存器间接:在这种模式下,有效地址在寄存器中,相应的寄存器名将保留在指令的地址字段中。 这里需要一个寄存器引用,一个内存引用来访问数据。
    2. 内存间接:在这种模式下,有效地址在内存中,相应的内存地址将保留在指令的地址字段中。 这里需要两个内存引用来访问数据。
  • 索引寻址模式 :操作数的偏移量是索引寄存器SI或DI的内容与8位或16位位移之和。
    Example:MOV AX, [SI +05] 
  • 基于索引的寻址: 操作数的偏移量是基址寄存器BX或BP和索引寄存器SI或DI的内容之和。
    Example: ADD AX, [BX+SI] 

    根据控制权的转移,寻址模式为:

    • PC相对寻址模式: PC相对寻址模式用于实现控制的段内传输,在这种模式下,通过向PC添加位移来获得有效地址。
      EA= PC + Address field value
      PC= PC + Relative value.
    • 基址寄存器寻址模式: 基址寄存器寻址模式用于实现控制的段间传输。在这种模式下,通过将基址寄存器值与地址字段值相加来获得有效地址。
      EA= Base register + Address field value.
      PC= Base register + Relative value.
      

      注:

      1. 这两种寻址模式都适用于运行时的程序重新定位。
      2. 基于寄存器的寻址模式最适合写位置无关的代码。

    寻址模式的优势

    1. 为程序员提供指针、循环控制计数器、数据索引和程序重新定位等设施。
    2. 减少指令寻址字段中的位数。

    示例门问题

    将左侧给出的每个高级语言语句与右侧列出的最自然的寻址模式相匹配。

    1. A[1] = B[J];         a. Indirect addressing
    2. while [*A++];        b. Indexed  addressing
    3. int temp = *x;       c. Autoincrement

    (A) )(1,c)、(2,b)、(3,a) (B) (1,a)、(2,c)、(3,b) (C) (1,b)、(2,c)、(3,a) (D) (1,a)、(2,b)、(3,c)

    答复: (C)

    说明:

    List 1                           List 2
    1) A[1] = B[J];      b) Index addressing 
    Here indexing is used
    
    2) while [*A++];     c) auto increment
    The memory locations are automatically incremented
    
    3) int temp = *x;    a) Indirect addressing
    Here temp is assigned the value of int type stored
    at the address contained in X

    因此(C)是正确的解决方案。

    本文由 Pooja Taneja。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享