专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基址变址寻址方式访问二维数组

作者:佚名   来源:本站原创   点击数:  更新时间:2010年09月15日   【字体:

位移量:数组首地址

 

基址寄存器:数组元素行址  BP、BX

 

变址寄存器:数组元素列址  SI、DI

 

设ARRAY是10行、10列二维数组,按行存放在主存的堆栈段中,每个元素占一个字节单元。

 

MOV  AL,ARRAY[BP] [SI]

 

ARRAY(i,j)等价于:(BP)=i×10  (SI)=j

 

所以:EA=ARRAY的偏移量+(BP)+(SI),段基址隐含由SS提供

 

 

下面介绍一下基址变址寻址方式:

 

变址寻址:EA是SI、DI和位移量提供  基址寻址:EA是BX、BP和位移量提供

 

MOV  CH,10H[SI]  ==  MOV  DS:CH,10H[SI]

MOV  TAB[DI],AX  ==  MOV  DS:TAB[DI],AX

 

  

MOV  AL,ARY[BX]  ==  MOV  DS:AL,ARY[BX]

MOV  STR[BP],DX  ==  MOV  SS:STR[BP],DX

 

 

    例如:用变址寻址方式访问一维数组,一维数组ARY存放在主存的数据段中,每个元素占两个字节单元。从数组首地址起依次存放:ARY(0)、ARY(1)、……、ARY(i)、……

 

可以通过下列指令来访问数组中的任意元素:

 

MOV  AX, ARY[SI]

 

访问ARY(i),则(SI)=i×2

 

所访问元素的逻辑地址:EA=ARY的偏移量(数组首址)+(SI)

 

段基址隐含由DS提供

 

 

 

    从上边的两个小例子,基址变址寻址方式访问二维数组&&变址寻址方式访问一维数组,总结一下8086/8088的寻址方式。

 

概括的说寻址方式就是寻找操作数的地址的方式,一共有8种方式:

 

  寄存器寻址方式

  立即数寻址方式

  存储器寻址方式

 

                     串操作寻址方式

                     I/O端口寻址方式

 

其中存储器寻址方式包含4种:

 

                    直接寻址方式

                    寄存器间寻址方式

                    变址基址寻址方式

                    基址变址寻址方式

 

    这是视频教程中的分类方法,不同的教程分类方式不一样,重点是理解寻址过程。下面举一些例子来说明各种寻址的具体方式。上面得8种方式前3大类(6小类)是重点,而后边的串操作寻址方式、I/O端口寻址方式这里先不做讨论。

 

 

寄存器寻址方式:

    指令所需的操作数在寄存器中,按指令给出的寄存器地址去获得操作数。

 

指令代码  操作码  REG(操作数)

 

    当然此处的操作数可能不是一个,但要求是REG,也就是操作数存储在寄存器中,根据操作码定义的操作在REG中取操作数。

 

MOV  AX,BX

MOV  BL,AL

MOV  BP,DX

MOV  DS,AX

 

    很显然操作码后边的操作数都是REG,有通用寄存器,也有段寄存器,至于专用寄存器教程中没有涉及到,不知道能不能用。CPU内的寄存器有三类14种,分类如下:

 

通用寄存器
专用寄存器
段寄存器
数据寄存器
指针寄存器
变址寄存器
指令指针 
 
IP
状态指针  
 
FLAG
代码段  
 
 
CS
数据段  
 
 
DS
堆栈段  
 
 
SS
附加段  
 
 
ES
AX
BX
CX
DX
堆栈指针SP
基址指针BP
源变址
SI
目的变址
DI
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
立即数寻址方式:

 
    指令所需的操作数直接在指令代码中,随着取指令(代码段中)一起取到BIU的指令队列中,常用来提供常数,且立即数只能做源操作数。

 

                   MOV  CX,1000H

                   MOV  AL,0AH

                   MOV  AH,'A'

                   MOV  DX,"AB"

 

 

    以下4种寻址方式为存储器寻址方式,操作数在内存储器中,在汇编语言程序中,根据存储器按段划分(不连续)的思想,存储单元地址使用逻辑地址:

 

                     段基址:偏移量

 

    存储器寻址方式重点是形成操作数逻辑地址的偏移量。这个偏移量是相对而言的,分偏移量组合形成最终偏移量也就是有效地址EA,虽然有效地址也不是物理地址,而是相对于段基址的逻辑地址。物理地址的算法:

 

                  物理地址=段基址×16+偏移量

 

 

有效地址EA是三个地址分量的某种组合:

 

 

(1)位移量:指令代码中的一个8/16位二进制数

 

(2)基地址:BX或BP得内容

 

(3)变址量:SI或DI的内容

 

    正是上边三种分量的组合形成了下面四种寻址方式(内存储器寻址方式):

 

直接寻址方式:

 

    指令所需要的操作数在存储器中,操作数的有效地址EA直接由指令代码中的位移量提供。汇编指令中,直接寻址方式可用数值地址或符号(事先有宏定义)地址来表示。

 

             指令代码   操作码 | …… | 位移量(8/16位)

 

 

MOV  BX,[1000H]

 

MOV  BX,VAR

 

 

    很显然呀,后边的操作数不加前缀有默认的段基址,加前缀的就用那个段基址,因此操作数地址是完全确定的,这就是直接寻址方式。

 

寄存器间寻址方式:

 

    指令所需要的操作数存在存储器中,操作数的有效地址EA直接从寄存器SI/DI/BX/BP中获得。当然有效地址需要配合段基址形成实际地址。

 

              指令代码  操作码|MOD REG  R/M

 

注意两点:

 

①以SI、DI、BX间接寻址时,隐含使用DS;

 

②以BP间接寻址时,隐含使用SS;

 

 

MOV  CH,[SI]

MOV  [DI],AX

MOV  AL,[BX]

MOV  [BP],DX

 

 

                         MOV  CH,DS:[SI]

                         MOV  DS:[DI],AX

                         MOV  AL,DS:[BX]

                         MOV  SS:[BP],DX

 

 

 

变址寻址或基址寻址方式:

 

    指令所需要的操作数在存储器中,操作数的有效地址EA是两个地址分量之和。从下面的代码格式可以看出它和上边寻址方式的主要区别就是分量的增加。

 

          指令代码  操作码 | MOD REG  R/M | 位移量

 

基址寻址:操作数的EA是SI或DI内容与位移量之和。

 

变址寻址:操作数的EA是BX或BP内容与位移量之和。

关闭窗口

相关文章