单片机寻址方式小结

发布者:真实幻想最新更新时间:2013-03-08 来源: 21IC 关键字:单片机  寻址方式  存储结构 手机看文章 扫描二维码
随时随地手机看文章

当前,单片机种类很多,且实际工作中仅应用一种单片机也是不现实的,必得对常用的几种单片机有所了解。

尽管现在单片机编程大多使用C语言,但必得对单片机的内核结构、存储结构及指令集有一定的了解,才有可能写出优秀的程序代码。对于单片机指令的学习,寻址方式的学习是其中的一个重点和难点,寻址方式的正确理解不仅对汇编编程至关重要,而且有助于对于单片机内核结构(如RISC和CISC的区别)、存储结构的更深刻理解。

但是,不同单片机都提供了一些不同的寻址方式,且即使同样的寻址方式在不同的单片机中也有不同的名称,使得寻址方式显得混乱,不一致,不易理解。

不过,经过仔细的对比、学习和分析,我发现,其实所有的寻址方式,都可以归为以下六类:

1)立即寻址

2)无址寻址

3)寄存器直接寻址

4)寄存器间接寻址

5)内存直接寻址

6)内存间接寻址

下面对以上六类指令一一分解:

1、立即寻址,即在指令中直接给出实际的操作数数值,如MOV R1,#0

2、无址寻址,就是说指令中根本没有给出操作数或操作数地址,其原因可能是以下两者之一:其一,本指令确实不需要操作数,如NOP指令;其二,本指令本身就是专门为某一个操作数制造的,它不可能用来操作其他的操作数,如CLRA指令(由其名称可知,它用来清零累加器A)。

3、寄存器直接寻址,这是一种十分重要,十分常见,也十分易于理解、易于掌握和应用的寻址方式,就是在指令中直接给出寄存器编号(在汇编中,给出的是寄存器的标号,也可以视作寄存器的名称)作为操作数的寻址方式,而待操作的数据就存在此寄存器中。如指令MOV R1,R2就是一条双操作数都采用寄存器直接寻址的指令。

另外,这种寻址方式在一些处理器构架中又会有一些细微变化,如在ARM中由于大量使用寄存器直接寻址方式,为了增强此寻址方式的威力,ARM处理器中的寄存器直接寻址加入了移位功能,即在实际指令执行中的数据不是简单的寄存器中直接存储的数据,而是此数据经过移位后得到的数据。

4、寄存器间接寻址,如同寄存器直接寻址,都是在指令编码中给出寄存器编号(在汇编中表现为寄存器名称);但与寄存器直接寻址不同的是,此处寄存中存储的并非操作数本身,而是操作数在内存中的位置,即操作数的地址(相当于C语言中的指针),在内存中此地址处存储的才是真正的操作数。所以,CPU要获取此操作数,在微观上需要进行两次数据获取操作,第一次从寄存器中获取操作数的地址,第二此从刚才获取的地址处在内存中获取真正的操作数。在多数处理器中,指令使用寄存器间接寻址比使用寄存器直接寻址运行要耗费更多的指令周期。如指令 MOV R1,@R2将R1中的数据复制到R2中地址所指向的内存中。

寄存器间接寻址是变种最多、扩展最多的寻址方式,正因如此,他也是处理器中最为灵活、最为强大、最为难于掌握的寻址方式。不仅不同处理器对它进行了不同的扩展,而且即使对于完全相同的扩展,不同汇编中也可能给出相差极大的书写格式,这就更加导致了寄存器间接寻址难于理解、难于掌握。

其扩展主要有以下形式:1)自增、自减型,@R1++、@R1--、@(--R1)、@(++R1),看到它们的书写形式大家应该也大体明白它们的意思了,当然具体的汇编书写格式那就根据不同的处理器和汇编器变得五花八门了,比如有的不用@号而用中括号,有的只用一个加减号而不是两个,有的只提供了四种变体中的一种或几种,情况不一而足,但其实质内容却大体一致。2)索引型(或叫偏移型),就是指寄存器中存储的地址还不是操作数的最终地址,须得对此地址加一个数才是最终的操作数地址。这种情况就更加复杂了,其一,书写格式更加纷乱,如我就见过X(R1)、[R1,X]、(R1+X)等多种形式;其二,偏移量X本身也涉及寻址方式这个问题,最常用的当然是立即寻址和寄存器直接寻址两种,但也不排除有更加复杂的寄存器间接寻址这种方式的使用,要是这个X本身要是也能使用寄存器间接寻址的变种——索引寻址,那可就真是热闹了(试想一下,这不就是迭代了吗)。

5、内存直接寻址,就是在指令中直接给出操作数的地址——存储于内存中的位置,表现在汇编中,为了区分立即数和内存地址,一般对地址加&或$前缀。如 MOV R1,$100

这个内存地址可以可以分两种情况给出:其一,直接给出完整的地址;其二,仅给出一个偏移量,将此偏移量加上PC才能得到操作数的地址。其中,前者一般叫做绝对寻址,后者一般叫做相对寻址(当然,有些汇编中可能并不这样称呼),二者很容易理解,也很容易区分。当然,二者也是各有优劣:绝对寻址简化了执行电路,因为他无需进行PC和偏移量的加法运算;而相对寻址则可精简编码长度,从而节省程序存储器消耗,当然,还有一个更加重要的好处,那就是可以利用这个特性编写“可搬移”的代码。因为使用相对地址,那么把程序整段搬移到其他的地址空间去,程序也能够正确的执行而不致出差。

对于同时提供了绝对寻址和相对寻址的CPU,在其汇编语法层面就需要给出区别两种寻址方式的语法,由于不同汇编给出的解决方法不同,这里仅以MSP430编程手册中给出的汇编语法为例进行介绍,以方便理解:

相对寻址:MOV ADDR,R4

绝对寻址:MOV &ADDR,R4

可见,这里是通过一个“&”符合进行绝对寻址和相对寻址的区分的。

另外,还有一个不大不小的问题需要注意,很多时候,使用内存直接寻址的汇编中并不直接给出地址数值,而是给出“标号,即label”,汇编器自己把这个标号用实际的地址值进行替代,所以就免除了地址的手工计算的麻烦。

6、内存间接寻址,参考寄存器直接寻址与寄存器间接寻址的异同,我们可以通过上面讲到内存直接寻址来推测出内存间接寻址的内容和概念。但是,鉴于在嵌入式处理器和单片机中一般都不使用内存间接寻址方式,所以,这里也就不再展开谈了。

另外,应该清楚,寻址方式并不是处理器设计者想怎么设计就怎么设计的,它很大程度上是由处理器内核结构和存储结构所决定的。一般来说,立即寻址和无址寻址在所有的处理器或单片机中都是存在的;而RISC构架的处理器中一般大量使用寄存器直接寻址,而寄存器间接寻址和内存直接寻址一般只用于加载(LDR)、存储(STR)指令之中,内存间接寻址则在RISC中基本不使用;而对于CISC架构的处理器,不仅大量使用寄存器直接寻址,而且大量使用灵活多变的寄存器间接寻址和内存直接寻址,甚至于会提供强大的内存间接寻址。所以,CISC构架处理器的指令一般功能更丰富、更强大,可以用比RISC技术更少的指令完成相同的功能,但代价是必须增加更多的地址解析译码电路,增加了芯片体积和功耗。

当然,我学单片机时间也不长,水平一般,也没有了解过太多的单片机,只是就自己了解过的ARM、51、AVR、PIC和MSP430做一个小小总结,希望能帮助初学者更快的学习和理解单片机指令。但是能力和见识有限,未免以偏概全,所以也希望功力深厚、见识广博的老前辈能够指正错误,或添加其他未提到的寻址方式。当然,若是那位有更好的寻址方式归纳总结方法分享,那将是更好了。

关键字:单片机  寻址方式  存储结构 引用地址:单片机寻址方式小结

上一篇:浅谈单片机程序设计中的“分层思想”
下一篇:谈谈单片机C语言编程中不经意间的一个小错误!

推荐阅读最新更新时间:2024-03-16 13:19

单片机学习的过程
单片机学习的过程应该是一个循序渐进、不断学习、不断积累的过程,可以分为三个阶段。 第一阶段:掌握开发单片机的必备基础知识。首先是熟练掌握单片机的基本原理,其实各家各门的单片机其基本结构和原理都差不多,特别是共有的知识需要好好理解和掌握。例如,内核结构、内存分配、中断处理、定时计数、串行通信、端口复用等一些最基本的概念和原理。除此之外,我们还需要具备模拟电子、数字电子、C语言程序开发知识以及原理图和PCB设计等一些技能。在进行系统开发的时候,进行原理设计、PCB布板、程序编写、系统联调这些工作都是在所难免的。 第二阶段:在掌握好一款单片机原理和应用的基础上,开始学习其他各家单片机的独有技术,学不了那么多也要多了解了解。同时尽可
[单片机]
单片机全自动洗衣机控制系统
本实践以单片机为基础,实现了全自动洗衣机控制系统设计。系统包含单片机、LCD显示屏、水位传感器、温度传感器等。全自动洗衣机包含的功能有:标准洗衣、经济洗衣、单独洗衣以及排水四种洗衣方式,有强洗、弱洗及运行/暂停、显示及报警功能,有自动烘干功能等。 仿真原理图如下 单片机源程序如下: #include reg51.h //定义头文件 #define uint unsigned int //定义字符uint #define uchar unsigned char //定义字符uchar #define TIME0H 0xff /
[单片机]
<font color='red'>单片机</font>全自动洗衣机控制系统
80C51单片机的startup.a51程序模块的作用
80C51在电源重置后(Power On Reset)所执行的第一个程序模块并不是使用者的主程序main(),而是一个隐藏在KEIL-C51标准链接库中称为startup.a51的程序模块。 startup.a51的主要工作是把包含idata、xdata、pdata在内的内存区块清除为0,并且初始化递归指针。接着startup.a51被执行的仍然是一个隐藏在KEIL-C51标准链接库中称为init.a51的程序模块。而init.a51的主要工作则是初始化具有非零初始值设定的变量。 在完成上述的初始化程序之后,80C51的控制权才会交给main()开始执行使用者的程序。
[单片机]
PIC单片机中预分频器的作用
预分频器是一个分频倍数可编程的8位计数器。其结构如图所示上节对预分频参数已有描述,这里不赘述。 预分频器的分配对象完全由程序控制。可以在程序中改变预分频器分配对象。 1、从RTCC到WDT的改变 MOVLW B‘XX0X0XXX’ ;选择内部时钟和新的预分频值 OPTION ;如果新的预分频值=“000”或者 CLRF RTCC ;=“001”,则暂时先选一个另外的值 MOVLW B‘XXXX1XXX’ ;清零RTCC和预分频器 OPTION ;选择WDT为对象,但不要改变预分频值 CLRWDT ;清WDT和预分频器 MOVLW B‘XXXX1XXX’ ;选择新的预分频值 2、从WDT到RTCC的改变 CLRWDT ;清
[单片机]
PIC<font color='red'>单片机</font>中预分频器的作用
STM8单片机软件判断复位源
下面跟大家说一下STM32单片机的端口重映射,这里是以USART1的重映射为例. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的. 三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 但是上电初始化后默认功能并非是USART1.所以想要用串口功能 .必须用端口重映射.. 大家知道,STM32的单片机每个功能模块有自己
[单片机]
STM8<font color='red'>单片机</font>软件判断复位源
基于51单片机控温程序及电路原理图
/*-------------------------------------------------------------------------------------------------------------------------------------------- * * * 该程序为一个完整的温度控制器程序 * * 最小系统温控板(后附图) * * 实现功能: * * 1 、 2X2 的矩阵按键:分别实现 ( 温度 +, 温度 - ,温度 * * 确认, 回 到初始化状态) * * 2 、先按键设定你要的温度值,然后按下确认键, * * 此时,水泥电阻开始加热,数码管动态显示电阻 * * 此
[单片机]
基于51<font color='red'>单片机</font>控温程序及电路原理图
μC/OS-II在80196KC单片机上的移植
摘要:主要讨论了将μC/OS-II实时操作系统在8019KC单片机上进行移植的原理和方法,给出了一个以Tasking C为编译器、以8019KC为处理器,对μC/OS-II实时操作系统进行移植的具体实例。 关键词:80196KC; uC/OS-II;Tasking C;移植 Intel的80196KC系列单片机在中国国内有很大一批用户。支持80196KC的C编译器生产厂商主要有Tasking和IAR。但国内使用Tasking公司C编译器的用户较多。由于μC/OS-Ⅱ系统为源码公开的实时操作系统,因此是当前嵌入式系统开发的主要方法。但是,在μC/OS-Ⅱ网站上没有现成的移植实例。因此,有必要进行一次移植以使操作系统成为μC/O
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved