数据传送类指令是编程时使用最频繁的一类指令。一般数据传送类指令的助记符为“mov”,通用的格式如下:
mov,数据传送类指令是把源操作数传送到目的操作数。指令执行后,源操作数不改变,目的操作数修改为源操作数。所以数据传送类操作属“复制”性质,而不是“搬家”。
数据传送类指令不影响标志位,这里所说的标志位是指cy、ac和ov,但不包括检验累加器奇偶标志位p。
1.以累加器为目的操作数的指令
这组指令的功能是把源操作数的内容送人累加器a,源操作数有寄存器寻址、直接寻址、间接寻址和立即数寻址等方式,例如指令:
2.以rn为目的操作数的指令
这组指令的功能是把源操作数的内容送入当前工作寄存器区的ro~r7中的某一个寄存器。
3.以直接地址direct为目的操作数的指令
这组指令的功能是把源操作数送入直接地址指定的存储单元。direct指的是内部ram或sfr地址。
4.以寄存器间接地址为目的操作数的指令
这组指令的功能是把源操作数内容送入ro或rl指定的存储单元中。
5. 16位数传送指令
这条指令的功能是把16位立即数送入dptr,用来设置数据存储器的地址指针。at89s51中设有两个dptr,通过设置特殊功能寄存器auxr1中的dps位来选择。当dps-i,则指令中的dptr即为dptr1,dptro被屏蔽,反之亦然。dptr既是一个16位的数据指针,又可分为dph和dpl两个8位寄存器进行操作,十分灵活、方便。设有两个dptr后,可避免频繁地出入堆栈操作。
对于所有mov类指令,累加器a是一个特别重要的8位寄存器,cpu对它具有其他寄存器所没有的操作指令。后面将要介绍的加、减、乘、除指令都是以a作为目的操作数的。rn为cpu当前所选择的寄存器组中的ro~r7,直接地址指定的存储单元为内部ram的ooh~7fh和特殊功能寄存器(地址范围为80h~ffh)。在间接地址中,用ro或rl作为内部ram的地址指针,可访问内部ram的ooh~7fh共128个单元。
6.堆栈操作指令
在at89s51的内部ram中可以设定一个后进先出(lifo,last in first out)的区域,称为堆栈。在特殊功能寄存器中有一个堆栈指针sp,它指定堆栈的栈顶位置。堆栈操作有进栈和出栈两种,因此,在指令系统中相应有两条堆栈操作指令。
(1)进栈指令
这条指令的功能是,首先将栈指针sp加1,然后把direct中的内容送到栈指针sp指示的内都ram单元中。
例如,当(sp)=60h,(a)=30h,(b)=70h时,执行下列指令
结果为(61h)=30h,(62h)=70h,(sp)=62h。
(2)出栈指令
这条指令的功能是,将栈指针sp指示的栈顶(内部ram单元)内容送入direct字节单元中,栈指针sp减1。
例如,当(sp)=62h,(62h)=70h,(61h)=30h时,执行下列指令:
结果为(dptr)=7030h,(sp)=60h。
7.累加器a与外部数据存储器ram/io传送指令
上述4条指令的助记符是在mov的后面加“x”,“x”表示at89s51单片机访问的是片外ram存储器或i/o口,是读外部ram存储器或i/o口中的一个字节的数据到累加器a中,或将累加器a中的一个字节的数据写入外部ram存储器或i/o口中。所以在执行前两条指令时,rd(的反)(p3.7)有效;执行后两条指令时,wr(p3.6)有效。
采用16位的dptr进行间接寻址,可寻址整个64kb片外数据存储器空间,高8位地址(dph)由p2口输出,低8位地址(dpl)由po口输出。
采用ri(i=0.1)进行间接寻址,可寻址片外256个单元的数据存储器。8位地址由po口输出,锁存在地址锁存器中,然后po口再作为8位数据口。
8.查表指令
这类指令共两条,均为单字节指令,这是at89s51指令系统中仅有的两条读程序存储器中表格数据的指令。由于对程序存储器只能读不能写,因此其数据的传送都是单向的,即从程序存储器中读出数据到累加器中。两条查表指令均采用基址寄存器加变址寄存器间接寻址方式。
这条指令以pc作为基址寄存器,a的内容作为无符号整数和pc的当前值(下一条指令的起始地址)相加后得到一个新的16位地址,把该地址指定的程序存储单元的内容送到累加器a。
例如:当(a)=30h时,执行地址1000h处的指令
该指令占用一个字节,下一条指令的地址为1001h,(pc)=1001h再加上a中的30h,得1031h,结果是将程序存储器中1031h的内容送入累加器a。
这条指令的优点是不改变特殊功能寄存器及pc的状态,根据a的内容就可以取出表格中的常数。缺点是表格只能存放在该条查表指令所在地址的+256个单元之内,表格的大小受到限制,而且表格只能被一段程序所利用。
这条指令以dptr作为基址寄存器,a的内容作为无符号数和dptr的内容相加得到一个16位地址,把由该地址指定的程序存储器单元的内容送到累加器a。
例如:(dptr)=8100h,(a)=40h,执行指令
结果是将程序存储器中8140h单元内容送入累加器a中。
这条查表指令的执行结果只与指针dptr及累加器a的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64kb程序存储器空间中任意安排,一个表格可以为各个程序块公用。
上述两条指令的助记符都是在mov的后面加“c”,“c”是code的第一个字母,即表示程序存储器中的代码。执行上述两条指令时,单片机的psen引脚信号(程序存储器读)有效。
9.字节交换指令
这组指令的功能是将累加器a的内容和源操作数的内容相互交换。源操作数有寄存器寻址、直接寻址和寄存器间接寻址等方式。例如:
执行下列指令:
结果为(a)=ofh,(r7)=80h,(40h)=08h,(30h)=foh。
10.半字节交换指令
这条指令的功能是,累加器的低4位与内部ram低4位交换。例如:(ro)=60h,(60h)=3eh,(a)=59h,执行完“xchd a,@ro”指令,则(a)=5eh,(60h)=39h。
设计应用超高频(UHF)的小型无源属射频识别(RFID)电子标签天线
边缘计算:物联网“草根”的崛起
智能影像时代,科技推动行业变革
基于文本语料推断含义及使用外部含义清单的含义表示模型
电路保护如何先躺赢,后躺平?
基于AT89S51数据传送类指令程序
航空发动机使用的七大新材料介绍
Oppo已发布了即将推出的智能手表的预告片
一加6T上手评测 值不值得买
小而快速的蓝牙数据包实现可靠的无线数据通信
清锋光固化3D打印机及弹性体3D打印解决方案解锁自行车鞍座新潮流
谷歌恢复Android授权许可 华为自研操作系统还会继续吗?
美国督促英国弃用华为设备 英国扶持三星和NEC“替代”华为
游戏业务遭AMD“夺食”,Quadro难逃时代变革
PCB设计中的AI应用挑战
采集PLC数据到工业物联网平台上进行监控和管理
JESD204B DSP套件的基本介绍
压感TWS阵营再添星品,NDT助力小米FlipBuds Pro探索人机交互创新
三安光电现状及未来发展
电路板单面好还是双面好