现在的位置: 首页 > 综合 > 正文

寻址方式

2018年05月24日 ⁄ 综合 ⁄ 共 1778字 ⁄ 字号 评论关闭

 直接寻址方式(Direct addressing)

  在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过((DS)×16)再加上这个有效地址形成,如下图所示。
  
  在汇编语言指令中,可以用符号地址(变量名或标号)代替数值地址。
  例如: MOV AX, DATA
    或 MOV AX, [DATA]
    这里DATA是存放操作数单元的符号地址。

  直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。
  例如: MOV AX, ES:NUMBER
    或 MOV AX, ES:[NUMBER]
    这里NUMBER是附加段中的字变量。

  直接寻址方式适合于处理单个变量。

寄存器间接寻址方式(Register indirect addressing)

  这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI来保存操作数的有效地址。如果指令中使用的寄存器是SI、DI和BX,则操作数在数据段中,((DS)×16)再加上存器中的有效地址形成20位物理地址;如果指令中使用的寄存器是BP,则操作数在堆栈段中,((SS)×16)再加上BP中的有效地址形成20位物理地址。如左图所示。  

  指令中也可以指定段跨越前缀来取得其他段中的数据。

  例如:MOV AX, ES:[BX]
  这种寻址方式可以用于表格处理。

  基址或变址寄存器初始化为表格的首地址,每取一个数据就修改寄存器的值,使之指向下一个数据。
 寄存器相对寻址方式(Register relative addressing)

  这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。如左图所示。  

  寄存器相对寻址方式也可以使用段跨越前缀。
  例如:MOV AX, ES:[DI+10]

  这种寻址方式同样可用于表格处理。
  表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。

基址变址寻址方式 (Based indexed addressing)

  这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址是一个基址寄存器(BP或BX)和一个变址寄存器(SI或DI)的内容之和。如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。如左图所示。  

  此种寻址方式也可使用段跨越前缀。
  例如:MOV AX, ES:[BX][SI]

  注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
  例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。

  这种寻址方式同样适用于数组或表格处理。
  首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。

相对基址变址寻址方式(Relative based indexed addressing)

  这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP组合。如左图所示。  

  这种寻址方式通常用于对二维数组的寻址。
  例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。

  这种寻址方式也为堆栈处理提供了方便。
  一般(BP)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。

  综上所述,有效地址可以由以下三种成分组成:
  · 位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。
  · 基址(Base)是存放在基址寄存器(BX或BP)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
  · 变址(Index)是存放在变址寄存器(SI或DI)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。

  有效地址的计算可用下式表示:
  EA = 基址 + 变址 + 位移量

  这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到不同的寻址方式。

抱歉!评论已关闭.