本公司不接受没有预约的上门推荐。
    西安西保特工电力自动化有限公司

    公司地址:陕西省西安市西咸新区丰信路1515号秦创原·亿沣创智科技谷A10栋(企业独栋)
    商务询价:xibaotegong@aliyun.com
    公司电话:029-88993287
    技术确认:xibaojishu@aliyun.com

    详细信息

    您现在的位置:网站首页 >> 常见问题 >> 产品知识 >> 详细信息

    数据传送类指令分析

    发布时间:2018-07-18  浏览:6343次  字号:  

     数据传送类指令的通用格式是:

    MOV  <目的操作数>,<源操作数>

    源操作数可以是:累加器A、通用寄存器Rnn=0-7)、直接地址direct、间接地址和立即数;

    目的操作数可以是:累加器A、通用寄存器Rnn=0-7)、直接地址direct和间接地址;

     数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,ACOV,但可能会对奇偶标志P有影响。

    [1]. 
    以累加器A为目的操作数类指令(4条)
        
    4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:

    MOV  A,direct     ;dataA) 直接单元地址中的内容送到累加器Adirect是直接地址
    MOV  A,#data    ;#data→A) 立即数送到累加器A
    MOV  A,Rn      ;RnA Rn中的内容送到累加器A中,Rn=R1-R7
    MOV  A,@Ri     ;((Ri))A Ri内容指向的地址单元中的内容送到累加器ARi=R0R1

    下面举个例子跟大家说明:
    MOV  A
    R1 ;将工作寄存器R1中的值送入到累加器A中,R1中的值保持不变。
    MOV  A
    50H;将内存50H单元中的值送入到累加器A中,50H单元中的值保持不变。
    MOV  A
    @R1;先看R1中是什么值,把这个值当做地址,并将这个地址单元中的值送入累加器A中,前面我们已学过,这是寄存器间接寻址方式。

    [2]. 
    以寄存器Rn为目的操作数的指令(3条)
        3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中,源操作数不变。有直接、立即和寄存器寻址方式:

    MOV  Rn,data     ;dataRn) 直接寻址单元中的内容送到寄存器Rn
    MOV  Rn,#data    ;#data→Rn)立即数直接送到寄存器Rn
    MOV  Rn,A        ;ARn) 累加器A中的内容送到寄存器Rn

    [3]. 
    以直接地址为目的操作数的指令(5条)
        
    这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式:

    MOV  data,data   ;datadata) 直接地址单元中的内容送到直接地址单元
    MOV  data,#data ;#data→data) 立即数送到直接地址单元
    MOV  data,A     ;Adata) 累加器A中的内容送到直接地址单元
    MOV  data,Rn    ;Rndata) 寄存器Rn中的内容送到直接地址单元
    MOV  data,@Ri   ;((Ri))data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元

    试比较一下MOV  50H,#60HMOV  50H,60H的区别

    [4]. 
    以间接地址为目的操作数的指令(3条)
        
    这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式:

    MOV  @Ri,data    ;data((Ri)) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元
    MOV  @Ri,#data   ;#data→((Ri))立即数送到以Ri中的内容为地址的RAM单元
    MOV  @Ri,A       ;A((Ri)) 累加器A中的内容送到以Ri中的内容为地址的RAM单元

    试比较一下MOV R0,20HMOV  @R0,20H的区别

    [5]. 
    查表指令(2条)
        这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:

    MOVC  A,@A+DPTR   ;((A))+DPTRA) 表格地址单元中的内容送到累加器A
    MOVC  A,@A+PC     ;((PC))+1→A),((A))+PCA) 表格地址单元中的内容送到累加器A

    本指令是将ROM的数据送入A中,本指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。
    说明:
    1
    、此条指令引出了一个特殊的寻址方式,即变址寻址,在上节课时我们已进行过讲解,本指令是要在ROM的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将ADPTR中的数加起来,就成为要查找单元的地址。
    2
    、查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。
    例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5
          MOV  DPTR,#TABLE
          MOV  A,R0
          MOVC A,@A+DPTR
    TABLE:DB   0,1,4,9,16,25
    R0中的值为2,送入A中,而DPTR中的值则为TABLE,则最终确定的ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也可以类推
    标号的真实含义:从这个地方也可以看到另一个问题,我们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它代表了01491625这几个数据在ROM中存放的起点位置。我们经常看到的指令,如LCALL DELAY指令中,DELAY则代表了以DELAY为标号的那段程序在ROM中存放的起始地址。事实上,CPU正是通过这个地址才找到这段程序的。
    可以通过以下的例子再来看看标号的含义:
    MOV  DPTR,#100H
    MOV  A,R0
    MOVC A,@A+DPTR
    .....
    ORG  0100H
    DB   0,1,4,9,16,25
    如果R0中的值为2,则最终地址为100H+2102H,到102H单元中找到的是4。这样应看明白了吧?
    那么为什么不这样写程序,要用标号呢?不是增加疑惑吗?
    如果这样写程序的话,在写程序时,我们就必须确定这张表格在ROM中的具体的位置,如果写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要改变了,要改为ORG  100H这句话了,我们是经常需要修改程序的,那么麻烦,所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这个麻烦的事交给计算机去做了。

    [6]. 
    累加器A与片外数据存储器RAM传送指令(4条)
        
    4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式:

    MOVX  @DPTR,A    ;A((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中
    MOVX  A, @DPTR   ;((DPTR))A) 数据指针指向片外RAM地址中的内容送到累加器A
    MOVX  A, @Ri     ;((Ri))A) 寄存器Ri指向片外RAM地址中的内容送到累加器A
    MOVX  @Ri,A      ;A((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中

    说明:
    1、在89C51中,与外部存储器RAM打交道的只可以是累加器A,所有需要送入外部RAM的数据必须要通过A送出去。而所有要读入外部RAM中的数据也必需要通过A读入。在此我们可以看出外部RAM的区别了。
    内部RAM间可以直接进行数据传递,而外部则不行。比如,要将外部RAM中某单元(设为110H单元的数据)送入另外一个单元(设为200H单元),也必须要先将110H单元中的内容读入A,然后再送入200H单元中去。

    2、要读写外部的RAM,当然也必须要先知道RAM的地址,在后两条指令中,地址是被地址放在DPTR中的,而前两条指令,由于Ri(即R0R1)只是一个8位的寄存器,所以只能提供低8位地址,因为有时扩展的外部RAM的数量比较少,少于或等于256个,就只需提供8位地址就足够了。请大家再复习下我们前面《51单片机的寻址方式》这节课。

    3、使用时应当首先将要读或写的地址送入DPTRRi中,然后再用读写命令。
    例:将外部RAM100H单元中的内容送入外部RAM200H单元中。
        MOV  DPTR
    #0100H
        MOVX A
    @DPTR
        MOV  DPTR
    #0200H
        MOVX @DPTR
    A


    [7]. 
    堆栈操作类指令(2条)
        4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。

    PUSH  data   ;SP+1→SP),(dataSP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中
    POP  data    ;SPdata)(SP-1→SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作

    第一条指令称为推入,就是将direct中的内容送入堆栈中,第二条指令称为弹出,就是将堆栈中的内容送回到direct中,推入指令的执行过程是:首先将P中的值加1,然后把SP中的值当做地址,将direct中的值送入以SP中的值为地址的RAM单元中去。
    例:
    MOV  SP
    #5FH
    MOV  A
    #100
    MOV  B
    #20
    PUSH ACC
    PUSH B
    执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元中的值就是100,同样执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后61H单元中的值变为20
    POP
    指令的执行也是这样的,首先将SP中的值做为地址,并将此地址中的数送到POP指令的那个direct中,然后SP1
    接上例:
    POP  B
    POP  ACC
    则执行过程是:将SP中的值(现在是61H)作为地址,取61H单元中的数值(现在是20),送到B中,所以执行完本条指令后B中的值是20,然后SP1,因此本条指令执行完后,SP的值变为60H,然后搪行POP ACC,将SP中的值(60H)作为地址,从该地址中取数(现在是100),并送到ACC中,所以执行完本条指令后,ACC中的值是100
    这有什么意义呢?ACC中的值本来就是100B中的值本来就是20,是的,在本例中,的确没有意义,但在实际工作中,则在PUSH B后往事要执行其它的指令,而且这些指令会把A中的值,B中的值改掉,所以在程序结束,如果我们要把AB中的值恢复原值,那么这些指令就没有意义了。
    还有一个问题,如果我们不用堆栈,比如说在PUSH  ACC指令处用MOV 60H,APUSH  B处用指令MOV  61H,B,然后用MOV  A,60HMOV  B,61H来替代两处POP指令,不也是一样吗?是的,从结果上看是一样的,但从过程看是不一样的,PUSHPOP指令都是单字节,单周期指令,而MOV指令则是双字节,双周期指令,更何况,堆栈的作用不止于此,所以一般的计算机上都设有堆栈,而我们在编写子程序,需要保存数据时,通常不采用后面的方法,而是用堆栈的方法来实现。
    例:写出以下程序的运行结果
    MOV  30H
    #12
    MOV  31H
    #23
    PUSH 30H
    PUSH 31H
    POP  30H
    POP  31H
     
    结果是30H中的值变为23,而31H中的值则变为12。也就是两者进行了数据交换。从这个例子可以看出:使用堆栈时,入栈的书写顺序和出栈的书写顺序必须相反,才能保证数据被送回原位,否则就出错了。
    另外特别注意事项:
    进行堆栈操作时,我们不能:
    PUSH  R0
    PUSH  R1
    而只能:
    PUSH  00H
    PUSH  01H
    POP
    也是一样。

    [8]. 交换指令(5条)
        5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。

    XCH      A,Rn    ;A←→Rn)累加器与工作寄存器Rn中的内容互换
    XCH      A,@Ri   ;A←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换
    XCH      A,data  ;A←→data)累加器与直接地址单元中的内容互换
    XCHD   A,@Ri  ;A3-0←→((Ri3-0)累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换
    SWAP   A      ;A3-0←→A7-4)累加器中的内容高低半字节互换

    [9]. 16
    位数据传送指令(1条)
        
    这是89C51单片机唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入数据指针DPTR中去。其中高8位送入DPH,低8位送入DPL

    MOV  DPTR,#data16  ;#dataH→DPH),#dataL→DPL16位常数的高8位送到DPH,低8位送到DPL

    例如:MOV DPTR,#2345

    则执行完程序后,DPL中的值为23DPL中的值为45

     

    本公司不接受任何形式的上门推销,只接受电子邮件。
    陕公网安备ICP15014344© 2021
    地址:陕西省西安市西咸新区丰信路1515号秦创原·亿沣创智科技谷A10栋(企业独栋) 邮箱:xibaotegong@aliyun.com
      西安西保特工电力自动化有限公司 版权所有 2024