义隆单片机课堂
EM78P447S单片机入门与实作系列讲座

🏠 首页 《无线电》杂志 2002年 🔗 第5期 🔗 第1065353216页 分类:电脑与单片机 🔗

4. 操作数的寻址方式

操作数指定参与运算的数据或者数据所在的存放地址。所谓“寻址”就是寻找操作数的存放地址,也就是给操作数定位的过程。所谓寻址方式,就是寻找操作数或操作数所在地址的方法和形式。

在EM78P447S的指令系统中,根据操作数的来源不同,设计了5种寻址方式:立即寻址、直接寻址、隐含寻址、间接寻址和比特寻址。


(1) 立即寻址

图1
图1 🔍原图 (567×307)

在这种寻址方式中,操作数在指令码中直接获取(这种在指令码中直接携带的操作数就称为立即数)。

[例]ADD A,@16H;

实现的功能是,将立即数16H(前面需要带有一个标识符@)与累加器A的内容(假设为99H)相加,结果(AFH)送到A。其指令码的二进制形式为:1,1111,0001,0110;其中前5位是操作码,后8位就是立即数。指令执行过程如图3所示。算术逻辑单元ALU的两个入口,送入的分别是加数16H(来自指令码)和被加数99H(来自累加器A),在ALU中完成加法操作,从ALU的唯一出口把结果AFH送回A中。


(2) 直接寻址

图2
图2 🔍原图 (567×278)

采用直接寻址方式的指令,可以在指令码中直接获取一个存放着操作数的存储地址,即指令码中包含着被访问(即读写)寄存器的单元地址。


[例]OR A,15H;

图3
图3 🔍原图 (850×544)

实现的功能是,将地址为15H的RAM单元的内容(假设是16H)与累加器A的内容(假设是99H)进行逻辑“或”之后,结果(9FH)送入A中。参加逻辑“或”运算的一个数据(16H)所在的单元地址(15H)可以从指令中直接得到。操作过程如图4所示。


(3) 间接寻址

图4
图4 🔍原图 (709×399)

在采用寄存器间接寻址方式的指令码中,6位寄存器地址必为“全0”。利用rrrrrr=000000这个“专用地址”,特指RSR(RAM选择寄存器),并且是以RSR寄存器内容为地址,所指定的工作寄存器单元中存放着被访问的数据。从表面上看,指令码中的6位0指定的是IAR(间接寻址寄存器),其实IAR仅仅是一个有名无实的寄存器单元,只不过是将它的地址编码给专用化了。这样做可大大简化指令系统。

为了便于理解,我们不妨换一个角度来分析,把RSR看成一个具有双地址(分别为00H和04H)的特殊的寄存器单元,而可以不再提及IAR寄存器。当用地址04H访问RSR时,就像访问普通寄存器一样,可以直接对RSR的内容进行读或写;而用地址00H访问RSR时,而它就是一个间接寻址寄存器,不是对RSR的内容进行读或写,而是把它的内容作为地址使用。假如用户所需要访问的一组寄存器有地址相邻的特点,使用间接寻址是很方便的。


[例]XOR A,0;

实现的功能是,将15H号RAM单元的内容(假设为16H)与A内容(假设为99H)相“异或”,运算结果(8FH)送回A。参加“异或”运算的一个操作数(16H)可以从指令码中间接得到。RSR、A和15H号RAM单元的内容都是预先存入的。其操作过程如图5所示。

在下页的图6中描述了直接寻址方式和间接寻址方式,这两种寻址过程中RAM工作寄存器地址的形成。对于直接寻址方式,体选码来自RAM选择寄存器RSR的最高2位,体内地址直接来自指令码;对于间接寻址方式,体选码也来自RAM选择寄存器RSR的最高2位,但是体内地址却来自RSR的低6位。

对于RAM的特殊功能寄存器空间中的各寄存器只能进行直接寻址,不能进行间接寻址。


(4) 隐含寻址

采用隐含寻址方式的指令,在指令码中不必指明存放着操作数的存储地址,即指令码中并非包含着被访问(即读写)寄存器的单元地址,就可以自动地访问一个默认的寄存器。


[例]CONTR;

实现的功能是,将控制寄存器CONT的内容读取之后,经过ALU送到累加器A中(CONT寄存器没有统一的地址编码,这一点与众不同)。其操作过程如图7所示。


(5) 比特寻址

可以对任一寄存器中的任一比特位直接寻址访问,也就是指令码中既包含着被访问寄存器的地址,又包含着该寄存器中的某一比特的地址。如果将RAM存储器看成一个阵列的话,那么在这个阵列中寻找某一个比特,就需要一个纵坐标和一个横坐标。纵坐标就相当于单元地址,横坐标就相当于比特地址。


[例]BS 15H,4;

实现的功能是把地址为15H的寄存器单元内的比特4置为1。

5. 以累加器A为中枢的数据传递方式

数据的逻辑运算和算术运算过程,以及控制信号的输入和输出过程,在单片机内部都可以看成是“数据传递”的过程。根据EM78P447S的硬件系统和软件系统(即指令系统和寻址方式)的规划特点,我们可以总结出在单片机内部,在各个寄存器之间进行数据传递,能够实现的几种途径和方式。不妨可以用图8进行形象化地描述。该图中的每一条带箭头的线条都代表一种传递方式,在每一条带箭头的线条旁边,还同时分别给出了实现相应的那一种数据传递所用指令的一个实例。其中有一点值得注意的是,“MOV R,R”指令中的“R”实际指的是同一个工作寄存器单元,该指令的目的是影响标志位“Z”。事实上,就不存在不同工作寄存器单元之间直接传递的指令,只能以A作中转实现间接传递。

6. “CPU内核—专用寄存器—模块或部件”三者相互关系

对于单片机的开发和应用,其主要任务有两项:一是软件设计,二是硬件设计。硬件设计我们暂且不提,在此只想用软件设计的观点,从不同角度剖析和理解单片机内部的组织关系。

软件设计实际上就是运用指令编制程序,而EM78P447S单片机的每条指令的作用范围非常集中,作用的对象也比较单纯,仅仅限制在(包含着专用寄存器和通用寄存器的)数据存储器RAM的范围之内,也就是说,指令的操作对象主要就是数据存储器中的各个寄存器单元。单片机的工作过程就是用一条条的指令“指挥”各部分硬件的动作,那么,这种“指挥”就是通过给特殊功能寄存器填写相应的参数来实现的。因此,我们不妨将EM78P447S单片机画成如图9所示的形式,其CPU内核与专用寄存器之间存在着灵活的“软件上的对应”关系,而专用寄存器与外设模块和功能部件之间存在着固定的“硬件上的映射”关系。专用寄存器在中间扮演着桥梁或者界面的角色。

单片机与外界交换信息的方向有两个:(1) 各个外设模块从外部世界(指单片机芯片的封装之外)采集的现场信息,经过硬件电路反映到与自身对应的专用寄存器内,CPU通过执行指令从该寄存器里获取相应的信息;(2) CPU通过填写与某一外设模块对应的专用寄存器单元,由该寄存器单元经过硬件电路将控制信息映射到外设模块上,再由外设模块驱动外接电路完成相应的运作,从而将CPU的命令落到实处。

我们在用指令编写程序时,不仅应搞清指令系统中每条指令的功能,还应弄清专用寄存器与外设模块或功能部件之间的对应关系。

(大海创作室)