📜  寻址方式

📅  最后修改于: 2021-06-28 09:14:06             🧑  作者: Mango

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

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)
  • 立即寻址模式(符号#):在这种模式下,数据存在于指令的地址字段中。其设计类似于一种地址指令格式。
    注意:立即模式的限制是常量的范围受地址字段大小的限制。
    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. 基于PC相对nad的寄存器两种寻址模式都适合在运行时进行程序重定位。
      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)是正确的解决方案。