历史上的今天
返回首页

历史上的今天

今天是:2025年03月10日(星期一)

正在发生

2018年03月10日 | AT89S51数据传送类指令

2018-03-10 来源:eefocus

  数据传送类指令是编程时使用最频繁的一类指令。一般数据传送类指令的助记符为“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。

推荐阅读

史海拾趣

Elite公司的发展小趣事

随着科技的不断进步,Elite始终将技术研发作为公司发展的核心驱动力。公司投入大量资金引进先进设备和技术人才,不断提升产品性能和质量。同时,Elite积极拓展国内外市场,通过参加各类展会、建立合作伙伴关系等方式,提高品牌知名度和市场占有率。

Dawning Precision Co Ltd公司的发展小趣事

为了进一步提升产品的品质和可靠性,Dawning加强了品质管理体系的建设。公司引进了先进的生产设备和检测仪器,制定了严格的品质检测流程。同时,Dawning还定期对员工进行品质管理培训,提高员工的品质意识和操作技能。这些措施的实施,使得Dawning的产品在品质上得到了极大的提升,赢得了客户的信赖和好评。

DURACELL公司的发展小趣事

2016年3月1日,DURACELL公司正式成为伯克希尔·哈撒韦集团的一部分。这一重要事件标志着DURACELL公司在电子行业的地位得到了进一步巩固和提升。伯克希尔·哈撒韦集团是全球知名的投资公司之一,其强大的资本实力和市场影响力将为DURACELL公司提供更多的发展机遇和挑战。在伯克希尔·哈撒韦的支持下,DURACELL公司将继续致力于推动电池技术的创新和发展,为全球消费者提供更优质的产品和服务。

Hama公司的发展小趣事

为了提升产品的市场竞争力,H&D Wireless积极寻求技术合作。20XX年,公司与全球领先的微控制器解决方案提供商爱特梅尔(Atmel)携手,共同推出了基于AVR®微控制器的IEEE802.11b+g Wi-Fi解决方案。这一合作不仅提升了H&D Wireless产品的功耗效率和连接稳定性,还显著缩短了客户的产品开发周期。通过不断优化产品性能,H&D Wireless的Wi-Fi解决方案在市场上获得了广泛认可。

DEVCON公司的发展小趣事

随着DEVCON品牌知名度的提升和产品线的不断丰富,公司开始将目光投向更广阔的市场。通过与国际知名企业的合作和代理,DEVCON的产品逐渐进入全球电子制造和维修领域。同时,公司还积极开拓新兴市场,如汽车电子、安防监控等领域,进一步扩大了市场份额。这种市场扩张的策略不仅带来了丰厚的回报,也为DEVCON公司的长期发展奠定了坚实基础。

Directed Energy Inc公司的发展小趣事

在电子行业中,创新是企业持续发展的关键。Directed Energy Inc始终将创新作为企业的核心竞争力之一,不断投入研发资源,推动技术创新和产品升级。公司拥有一支高素质的研发团队,他们紧跟行业发展趋势,不断探索新的技术和应用,为公司的发展注入了源源不断的动力。这种持续的创新精神使得Directed Energy Inc在电子行业中始终保持领先地位。

问答坊 | AI 解惑

求助:单颗LED的电源驱动设计

我现在有一颗LED需要驱动,6.5V,20mA。 需要做一个驱动器,希望可以控制电流大小,不需要连续调节,只需要在0mA和20mA之间切换就行。怎么做最好? 电源有开关电源可以提高。…

查看全部问答>

How to select TVS

This is MicroNotes ,which writed by Kent Walters .Tell you how to select TVS.…

查看全部问答>

关于Protell99的前景

现阶段很多朋友,特别是刚出学校的都喜欢用Protell99,这款软件对于来讲自我感觉确实还不错,但是我有很多朋友并不看好它,认为其POWER PCB更为先进…

查看全部问答>

2808最小系统

这里有高手做过2808的最小系统吗?…

查看全部问答>

AD中两个元件相距太近时报错,怎么办?

AD中两个元件相距太近时报错,在哪里可以调节这个这个值啊(允许的最小间距)…

查看全部问答>

uclinux和linux是不是应用层接口一样的?

就是说是不是linux的应用层软件可以不改动直接移植到uclinux上?…

查看全部问答>

电机上电瞬间引起单片机复位的问题

驱动信号已经通过光耦隔离,复位电路是低电平复位,vcc接电阻,电容接地,是什么原因呢?…

查看全部问答>

串口 应答信号

我想设计一个通信协议,我的1号机发出握手信号后收不到2号机的应答信号,但是我把2号机和PC机的串口调试助手直接连接就能收到应答信号,为什么?大家帮我看看我的程序那里的问题好吗? void serial() interrupt 4 using 1     &nbs ...…

查看全部问答>

eeworld上可用分怎么计算的,回复一个贴子就有10分可用分?回复自己的贴子有没可用分?戴红花什么意思?奖牌表示什么?eeworld上游戏规则是什么?

eeworld上可用分怎么计算的,回复一个贴子就有10分可用分?回复自己的贴子有没可用分?戴红花什么意思?奖牌表示什么?eeworld上游戏规则是什么?…

查看全部问答>

[求助]用汇编实现辛普森积分

怎样用汇编语言实现辛普森数字积分? 下面是C程序,哪位能帮忙搞个汇编版本的?只要有辛普森函数那部分就可以 /*-------复化辛普森求积公式---------*/ #include #include #include #define N 100 /*-------将要被求积的函数------*/ doubl ...…

查看全部问答>