新闻  |   论坛  |   博客  |   在线研讨会
51单片机指令系统分析
patton | 2008-07-21 10:58:46    阅读:5647   发布文章

学习汇编程序设计,要先了解CPU的各种寻址法,才能有效的掌握各个命令的用途,寻址法是命令运算码找操作数的方法。在我们学习的8051单片机中,有6种寻址方法,下面我们将逐一进行分析。

立即寻址

 

在这种寻址方式中,指令多是双字节的,一般第一个字节是操作码,第二个字节是操作数。该操作数直接参与操作,所以又称立即数,有“#”号表示。立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包含在指令字节中的。

例如:

MOV  A,#3AH

这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功能是把立即数3AH送入累加器A中。

MOV  DPTR,#8200H

前面学单片机的专用寄存器时,我们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。这条指令的意思就是把立即数的高8位(即82H)送入DPH寄存器,把立即数的低8位(即00H)送入DPL寄存器。

这里也特别说明一下:在80C51单片机的指令系统中,仅有一条指令的操作数是16位的立即数,其功能是向地址指针DPTR传送16位的地址,即把立即数的高8位送入DPH,低8位送入DPL

 

直接寻址

 

直接寻址方式是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数 例如:MOV  A,30H 
这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。

 

 

在80C51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间,具体的说就是:

       1、内部数据存储器RAM低128单元。在指令中是以直接单元地址形式给出。

我们知道低128单元的地址是00H-7FH。在指令中直接以单元地址形式给出这句话的意思就是这0-127共128位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元地址给出、127位就是以7FH形式给出。 、位寻址区。20H-2FH地址单元。
、特殊功能寄存器。专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。例如下面我们分析的一条指令MOV  IE,#85H 前面的学习我们已知道,中断允许寄存器IE的地址是80H,那么也就是这条指令可以以MOV  IE,#85H 的形式表述,也可以MOV  80H,#85H的形式表述。

2

 

3
对于数据存储器RAM的内部情况,请查看我们课程的第十二课。

直接寻址是唯一能访问特殊功能寄存器的寻址方式!

 

大家来分析下面几条指令:
,A       ;将A的内容送入内部RAM的65H单元地址中

 

MOV  65H

 

MOV  A,direct    ;将直接地址单元的内容送入A中
;将直接地址单元的内容送直接地址单元
;将立即数85H送入中断允许寄存器IE

        MOV  direct,direct

 

MOV  IE,#85H     

 

 

前面我们已学过,数据前面加了“#”的,表示后面的数是立即数(如#85H,就表示85H就是一个立即数),数据前面没有加“#”号的,就表示后面的是一个地址地址(如,MOV 65H,A这条指令的65H就是一个单元地址)。

寄存器寻址

寄存器寻址的寻址范围是: 、4个工作寄存器组共有32个通用寄存器,但在指令中只能使用当前寄存器组(工作寄存器组的选择在前面专用寄存器的学习中,我们已知道,是由程序状态字PSW中的RS1和RS0来确定的),因此在使用前常需要通过对PSW中的RS1、RS0位的状态设置,来进行对当前工作寄存器组的选择。

1

 

2、部份专用寄存器。例如,累加器A、通用寄存器B、地址寄存器DPTR和进位位CY。

寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器名称就能得到操作数。

例如:MOV A,R0

这条指令的意思是把寄存器R0的内容传送到累加器A中,操作数就在R0中。

INC R3

这条指令的意思是把寄存器R3中的内容加1

 

 

从前面的学习中我产应可以理解到,其实寄存器寻址方式就是对由PSW程序状态字确定的工作寄存器组的R0-R7进行读/写操作

寄存器间接寻址

 

寄存间接寻址方式是指寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。

 

MCS-51单片机规定工作寄存器的R0、R1做为间接寻址寄存器。用于寻址内部或外部数据存储器的256个单元。为什么会是256个单元呢?我们知道,R0或者R1都是一个8位的寄存器,所以它的寻址空间就是2的八次方=256。
例:MOV  R0,#30H  ;将值30H加载到R0中
   
       MOV  A,@R0    ;把内部RAM地址30H内的值放到累加器A中

       MOVX A,@R0    ;把外部RAM地址30H内的值放到累加器A中

 

 

 

大家想想,如果用DPTR做为间址寄存器,那么它的寻址范围是多少呢?DPTR是一个16位的寄存器,所以它的寻址范围就是2的十六次方=65536=64K。因用DPTR做为间址寄存器的寻址空间是64K,所以访问片外数据存储器时,我们通常就用DPTR做为间址寄存器。

例:MOV   DPTR,#1234H 
;将DPTR值设为1234H(16位) ,@DPTR      ;将外部RAM或I/O地址1234H内的值放到累加器A中 

    MOVX  A

在执行PUSH(压栈)和POP(出栈)指令时,采用堆栈指针SP作寄存器间接寻址。

例:PUSH  30H    ;把内部RAM地址30H内的值放到堆栈区中堆栈区是由SP寄存器指定的,如果执行上面这条命令前,SP为60H,命令执行后会把内部RAM地址30H内的值放到RAM的61H内。

那么做为寄存器间接寻址用的寄存器主要有哪些呢?我们前面提到的有四个,R0、R1、DPTR、SP

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客