![单片机原理及应用系统设计](https://wfqqreader-1252317822.image.myqcloud.com/cover/759/41309759/b_41309759.jpg)
3.3.1 数据传送指令
数据传送是最基本、最主要的操作,共有29条,可分为内部RAM数据传送、外部RAM数据传送、程序存储器数据传送、数据互换和堆栈操作5组。
1.内部RAM传送指令(16条)
该组指令用于单片机内部数据存储区和寄存器之间的数据传送,指令格式见表3-1。
表3-1 内部RAM传送指令
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/53_01.jpg?sign=1739685700-mqp38PChMDt0mU22Oz26ny4LzozEAMPJ-0-bff1c54401b314fa59872dd8ddf57067)
(续)
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/54_01.jpg?sign=1739685700-70Hw2kwGFu032nuiEencx65tGmhC6qfu-0-2fac18116c9621700769115c4a6b98c7)
【例3-1】设片内RAM单元存放的数据是:(50H)=55H,(51H)=66H,(66H)=77H。分析以下指令顺序执行的目的操作数。
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/54_02.jpg?sign=1739685700-pqmI1zb9ldzsqHLQvIFoPPjGCh3LCPlf-0-3d3729856e24a3389d3132cf1114c061)
2.外部RAM传送指令(4条)
该组指令用于单片机外部数据存储区和寄存器之间的数据传送,指令格式见表3-2。
表3-2 外部RAM传送指令
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/54_03.jpg?sign=1739685700-9xNDMVK9FvL90XLleosWnlzyvVyfkJ6l-0-358a2d9e27dcadaa3fdd27e8f6ea7e6e)
这组指令采用了间接寻址方式,当采用16位数据指针DPTR间接寻址,完成DPTR所指定的片外数据存储器与A的数据传送时,可寻址范围达64KB。其中,低8位地址由P0口输出,高8位地址由P2口输出。当采用Ri(R0或R1)间接寻址,完成以R0或R1为间接地址的片外数据存储器与A的数据传送时,低8位地址由Ri指出,由P0口输出,高8位地址需要事先用指令“MOV P2,#data”指定。
【例3-2】以下程序实现把片内60H单元的数送到片外RAM的2000H单元。
解1:MOV A,60H
MOV DPTR,#2000H
MOV @DPTR,A
解2:MOV A,60H
MOV R0,#00
MOV P2,#20H
MOV @R0,A
3.程序存储器传送指令(2条)
该组指令用于从单片机内部ROM读取数据给累加器,指令格式见表3-3。
表3-3 程序存储器传送指令
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/55_01.jpg?sign=1739685700-4UAKKfo6WZ6nffVyXhgAoO2aPRWu2qfG-0-304cf1df0eade435ef81951c5548ce65)
这组指令又叫查表指令,属于变址寻址方式,是对存放于程序存储器中的数据表格进行查找传送。
第一条指令MOVC A,@A+DPTR,以DPTR作为基址寄存器,用来存放表的起始地址,它可以指向外部ROM的64KB范围内的任意一个地址单元,累加器A作为变址寄存器,在源操作数中作为数据表格起始地址的偏移地址。
第二条指令MOVC A,@A+PC,以PC作为基址寄存器,但指令中PC的地址是可以变化的,它随着指令在程序中位置的不同而不同,一旦指令在程序中位置确定以后,PC中内容也被给定,累加器A作为变址寄存器,在源操作数中作为当前PC值到数据表格中要访问数据的偏移字节,由于A的长度为一个字节,使用能够寻找的偏移地址应在FFH之内。
【例3-3】用查表指令把数据表TAB中第三个单元的数传给累加器A,比较使用两种查表指令的不同。
1)使用MOVC A,@A+PC
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/55_02.jpg?sign=1739685700-L8elx79jwnStwjPV5OifLpac4W31tuJZ-0-4600d5bb05fd3b0e967e2f895fb6e156)
2)使用MOVC A,@A+DPTR
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/55_03.jpg?sign=1739685700-lTYgT5tsPpRDS6VdE0v8JKsSGkq0ovqg-0-35a6fb00e6cbb1e93b0739b0526d634c)
以上两段程序执行的结果,累加器A中的数都为TAB表第3个单元中的43H。
4.堆栈指令
“堆栈”就是在单片机内部SRAM中定义一块存储空间,对这块区间进行数据“先进出后”的操作,操作的单元由堆栈指针指定。堆栈操作有进栈(PUSH)和出栈(POP)两条,操作数由直接地址确定,属于直接寻址,指令格式见表3-4。
表3-4 堆栈指令
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/55_04.jpg?sign=1739685700-0q9r2mucQpTso8TIBRKFxaSQEk8JzwoQ-0-3d23851fe265d1744384055e7abf783b)
【例3-4】通过堆栈,交换两个单元的数据。设(30H)=#12H,(31H)=#34H。
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/56_01.jpg?sign=1739685700-Jd35LEn1BsPS2gU81HtgdvkSTkyxpn3g-0-36d9d22825014793c033be29da925765)
5.字节交换指令(5条)
该组指令用于字节交换和半字节交换,指令格式见表3-5。
表3-5 字节交换指令
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/56_02.jpg?sign=1739685700-4dmxBpOkW4tUlQEkz9L0qwd9SimuBaQQ-0-737f50f17a44934cb5cb0e2bea67f8bc)
【例3-5】设A=60H,R6=A5H,(60H)=69H,顺序执行以下指令的结果。
![](https://epubservercos.yuewen.com/0DCF85/21511155608174006/epubprivate/OEBPS/Images/56_03.jpg?sign=1739685700-NeuJYtCMWlGjtE5ZCiBUhFjICXQh8XZ3-0-eb7b1f5ebfc62666df89e79592ebed14)