操作数的寻址方式(寄存器间接,基址寻址,间址寻址,比例间接寻址)

来源:互联网 发布:三国志11数据 编辑:程序博客网 时间:2024/05/08 15:59

计算机中程序是由按一定顺序排列的一系列指令,通常一条指令包括两方面的内容:操作码和操作数,操作码决定要完成的操作,告诉计算机要干什么;操作数指参加运算的数据及其所在的单元地址。整条指令以二进制编码的形式存放在存储器中。指令要进行操作,都有相应的数据参加,可是数据在哪里?是什么?都是通过不同的方式来找到的。这就是为什么需要寻址。

寻找指令中所需要的操作数或操作数地址的方式称为寻址方式。80486指令系统的寻址方式包括三种类型:操作数寻址、转移地址寻址及I/O端口寻址。其中操作数寻址有七种。

接上一篇博客:http://blog.csdn.net/tsj11514oo/article/details/52712103

4.寄存器间接寻址(register indirect addressing)

  • 操作数在存储器中,其有效地址EA存放在某个寄存器中。寄存器的使用在16位寻址和32位寻址时不一样。

(1)16位寻址

寄存器

有效地址存放在SI, DI, BX, BP中。
如果指令中指定的寄存器是BX, SI, DI,则操作数在数据段中,段基址在DS中,操作数的物理地址为:

SI:是源变址寄存器,默认段地址和DI一样,在DS中.和DS联用
DI:是目的变址寄存器.一般情况下与ds联用,来确定某个储存单元的地址
BX:基址寄存器,常用来存放访问内在时的基地址
BP:是基址指针,段地址默认在SS中.可以定位物理地址,比如:”mov ax,[bp+si+6]/mov ax,[bp+di+6]

SS: 堆栈段地址 ,指出当前堆栈的底部地址,即存放堆栈段的段基值。一旦你确定了堆栈地址,ss也不能随便改变了
DS:数据段寄存器,指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基值

物理地址

在一般情况下,如果有效地址在SI、DI和BX中,则以DS段寄存器的内容为段值;
这里写图片描述

如果有效地址在BP中,或者是说是指令中指定的寄存器是BP,则操作数在堆栈中,段基址在SS中(SS段寄存器的内容为段值。),操作数的物理地址为:

物理地址=(SS)×16+(BP)

例如:

  • MOV AX, [SI] ; 自动引用DS作为段寄存器,以DS段寄存器的内容为段值

    • 假设 (DS)= 5000H, (SI)= 1234H

    • 注意,在汇编语言中,带方括号“[ ]”的操作数表示存储器操作数,括号中的内容作为存储单元的有效地址EA。

    • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS。
    • 寄存器SI的值不是操作数,而是操作数的地址(有效地址)。该操作数的物理地址应由DS和SI的值形成。

    • 物理地址=(DS)×16+(SI)=50000H+1234H=51234H。那么存储的物理存储单元地址是51234H。
      再设该字存储单元的内容是6789H,那么在执行该指令后,(AX)= 6789H。

  • MOV DL, CS:[BX] ; CS作为段寄存器

    • 指定段超越前缀,此时引用的段寄存器是CS而不是自动引用了DS
    • 目的操作数显式指定的段寄存器为CS
    • 目的操作数的物理地址PA = CS * 16+BX
    • DL的值为该地址单元中存放的字类型数据
  • MOV AX, [BP] 引用的段寄存器为SS

    • 设SS=3000H,BP=1000H该指令寻址及执行过程如图所示。

    图3.4 MOV AX, [BP] 指令的寻址及执行过程

    • 目的操作数的物理地址PA =(SS)×16+(BP)=30000H+1000H=31000H
    • 把从物理地址为31000H开始的对应的一个字的值传送给AX寄存器。

(2)32位寻址

寄存器

  • 八个32位通用寄存器均可作为寄存器间接寻址使用。除ESP和EBP默认段寄存器为SS外,其余六个通用寄存器均默认段寄存器为DS。
  • 32位cpu通用寄存器: EAX,EBX,ECX,EDX,ESI,EDI(缺省为DS)/EBP,ESP(缺省默认为SS)

物理地址

**物理地址=(DS/SS)×16+(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP)**

寄存器间接寻址方式用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。

对比寄存器(直接)寻址和寄存器间接寻址:

对比项 寄存器(直接)寻址 寄存器间接寻址 含义 指令中指出暂存操作数的寄存器 指令中指明存放操作数偏移地址(有效地址)的寄存器 使用情况 当操作数在寄存器中使用 当操作数地址在寄存器中使用 寄存器的内容 操作数 操作数地址 表示形式 MOV AX, 1234h;ADD VARD,EAX;MOV AX, BX MOV AX,[BX]

5.基址寻址(based relative)

  • 基址寻址是将CPU中的基址寄存器的内容加上指令格式中的形式地址形成操作数的有效地址。将基址寄存器的内容作为基准地址。而指令的形式地址作为修改量。同形式地址相比,可以灵活设置基址寄存器的位数。
  • 操作数在存储单元中,操作数的有效地址EA由基址寄存器的内容和指令中给出的位移量之和算出。

格式:

操作码 基址寄存器号 形式地址

优点

可以扩大寻址能力,便于访问二维数组中某类指定的元素。解决程序的动态定位问题。

基址寄存器

(1)采用专用寄存器作基址寄存器

EA=(BR)+ABR为基址寄存器

这里写图片描述
执行过程中BR内容不变,形式地址A可变

(2)采用通用寄存器作基址寄存器

这里写图片描述

用户指定那个通用寄存器为基址寄存器
基址寄存器的内容有操作系统确定
执行过程中R0内容不变,形式地址A可变

(1)16位寻址

BX和BP作为基址寄存器。BX以DS作为默认段寄存器,BP以SS为默认段寄存器。位移量可以是8位或16位。

EA=(BX或BP)+位移量(8或16位)
EA:有效地址
例如:MOV BX, [SI+100H]

(2)32位寻址

八个32位通用寄存器均可作为基址寄存器,其中ESP, EBP以SS为默认段寄存器,其余均以DS为默认段寄存器。位移量为8位或32位。
EA=(基址寄存器)+位移量(8位或32位)

6.间址寻址()(indexed relative)

间址寄存器

间址寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。

间址寻址中,有效地址的计算公式如下:

EA=(间址寄存器)+位移量(8位或32位)

(1)16位寻址

仅SI和DI可作为间址寄存器,默认DS为段基址寄存器。

(2)32位寻址

除ESP外的其他七个32位的寄存器均可作为间址寄存器,EBP默认SS作为段基址寄存器,其余以DS作段基址寄存器。

基址寻址和间址寻址适用于对一维数组的数组元素进行检索操作。常用位移量表示数组起始地址的偏移量,基址/间址寄存器表示数组元素的下标,可通过修改下标来获取数组元素的值。

7.比例间接寻址(proportion indirect addressing)

比例间接寻址中有效地址的计算公式如下:

EA=(间址寄存器)×比例因子(2, 4或8)+位移量(8位或32位)

比例间接寻址方式只适用于32位寻址。

例如:MOV EAX,TABLE[ESI×4]

其中:TABLE为位移量,4是比例因子,ESI乘以4的操作在CPU内部完成。

0 0
原创粉丝点击