找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2042|回复: 2
打印 上一主题 下一主题
收起左侧

汇编之单片机数据传输寻址的机器指令码原理例解

[复制链接]
跳转到指定楼层
楼主
ID:266429 发表于 2019-3-4 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机汇编指令集中,每条指令均有长度,这个长度,其实指的是这条指令的机器代码的字节长度。每条指令的机器代码中,第一字节必然是机器指令码,其它字节则是操作数。
数据要在不同存储位之间传输,首先必须在指令中明确操作数的所在存储器种类和地址,即必须明确源操作数在哪种存储器中、其地址在哪,目的操作数在哪种存储器中,其地址在哪。
我们举一个例子:
汇编指令:MOV R0#data
汇编程序中例子:MOV R0#22H
程序功能说明:将十进制数据22送入寄存器R0中,即把程序存储器中的一个数据22H,送入数据存储器中的工作寄存器R0中。
机器指令: 1001110  00010110 (即78H  22H,前面78H为操作指令码,后面22H为被操作数(一般称为源操作数))。
该指令中的源操作数存于程序存储器这类存储器中,其地址为紧跟操作指令码78H所在单元之后的一个单元;
目的地为数据存储器中低128B区中,其地址为R0的地址。
我们来看看在这条指令中,是如何明确这几个内容的:
源操作数所在存储器种类:操作指令码直接明确指出为程序存储器;
源操作数所在程序存储器中的地址:操作指令码直接明确指出在操作指令码之后的一个单元中;
目的操作数所在存储器种类:操作指令码直接明确指出为数据存储器中;
目的操作数所在数据存储器中的地址:数据存储中低128B中的R0(如果是第一组工作寄存器,则其地址为00H)。
综上所述,我们可以明白,51单片机为“将程序存储器中机器指令码之后的一个单元中的数据送入单片机内工作寄存器R0,单设计了一条机器指令码。同样的,51单片机也为R1~R7各自对应设计了一条机器指令码,对应的为79H~7FH
该条指令为2字节指令,执行完成后,PC+2
吐槽:51单片机为8位机,最多只能做到256条机器指令码,这每一个位置都是宝贵的资源。象这样8个工作寄存器每个都对应设计一条机器指令码,显然不是最优化设计,在这种功能上平时也用不了这么多吧。也许是51出来得太早,当时考虑得并不是那么科学合理吧。现在要改也不是不行,但是兼容性是个绕不过去的坎。
处理器操作过程:处理器从程序存储器中取出78H,并被当作指令被送入指令解析控制器;指令解析控制器见到是78H,立即解析成将程序存储器中下一个地址中的内容取出并将其当作操作数送入R0中。(如果程序存储器中存的不是78H而是79H,那么紧随其后的内容就会被送入R1而不是R0,汇编程序就写成MOV R1#22H)。操作完成后,程序存储中的下一个内容将被当作操作指令码。
解读:从以上过程可以看出,现有汇编语言所称的立即数,其实是指存于程序存储器中紧随操作指令所在地址之后的一个地址中的内容。所以,以上程序例子可以这样解读:将一个操作数据送入R0中,该数据原存放于程序存储器中该操作指令所在地址之后的一个地址中;或者说将程序存储器中的一个数据送入R0中,该数据原存放于程序存储器中该操作指令所在地址之后的一个地址中。PC值的变化与该指令的字节长度一致。
该指令功能的其它实现方法:我们知道数据存储器低128B区是可以直接寻址的,所以,我们也可以用MOV direct,#data这个比较通用的语句来实现,其中的direct ,直接写成R0的地址就是了。但是,这就变成了3字节指令,单片机的执行时间必然延长,且只能使用一个固定的R0。这也是为什么本来可以用MOV direct,#data来实现却占用宝贵的资源专门来设计一类2字节指令的原因。
MOV direct,#data的机器指令码为75H,在这条语指令中,75H指出了源操作数存于程序存储器中该机器指令码之后的一个单元中,目的操作数在数据存储器中,其地址则由direct指定。
另外再细说明一下,教材中所指的“立即数”、“立即寻址”,其实就是指该数据存于机器指令码之后的一个单元中,该数据在汇编工具将整个程序汇编成机器码时,紧跟在该机器指令码之后,烧写工具按其顺序写入程序存储器中。
个人见解,不妥之处请高手指正。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-3-5 03:51 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:266429 发表于 2019-3-5 08:15 | 只看该作者
    写去写来还是写漏了一点重要的东西,那就是数据的传输方向,这个在指令中是必须明确指出的。在51的芯片设计中,其传输方向,全部在机器指令码中指定。象以上的例子中,78H指令码就已明确指明了传输方向是由程序存储器向数据存储器传输。这一点,也是因为与寻址方式是两回事,所以忘了,但这一点,对于我们弄明白51的指令系统设计,却是很重要的。
    按说,单片机可以设计或只设计一个通用数据传输指令,这个指令后面列一堆参数来指明存储器种类、具体地址、传输方向什么的,成为多字节指令,也能实现其功能,而且因为其通用性,编程序要简单得多。但是,正如前面说的,指令字节越少,则执行时间越短。这只是一个方面,另一方面,字节长了,则整个程序机器代码也就长了,在程序存储器中的占位也就多了,现在的ROM容量大了也许不觉得,但当年,盖子们可是为了能将一段程序装进当时容量可怜的ROM中,绞尽了脑汁的。
    还有,以上例子中所说的存储器,全部都说的是内部的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表