标题: 关于单片机机器指令与汇编指令的一些规则 [打印本页]
作者: 慢慢思考 时间: 2018-4-25 11:48
标题: 关于单片机机器指令与汇编指令的一些规则
本帖最后由 慢慢思考 于 2018-4-27 08:59 编辑
51单片机为8位机,所以其机器指令最多只能有256条。每一条机器指令在芯片内对应着一套硬件实现电路以达到快速运行的目的。
汇编指令是依据机器指令而编制的计算机编程语言,但我们在指令表中可以看出它们并不是一一对应关系,所以有汇编指令111条而机器指令为255条的说法。如”MOV A,Rn”是一条汇编指令,但对应的就是8个Rn均有不同的机器指令也即其对应8条机器指令,这8条机器指令同样也是各自对应一套硬件电路。
因此,在机器指令表中查不到的动作,你想实现就得自己编程,用已有的机器指令运行多次后来实现。
不要认为助记符本身就是汇编语言中的命令,”MOV A,R0”写全了才是一条完整的命令,什么叫完整?这条语句的执行全部是芯片里的硬件实现,所以它只有一个时钟周期就执行完了,它独占着一个机器指令。
对于SETB bit位操作,在这里面,SETB是一条完整的命令,它对应着一条机器指令,所以它先执行这条机器指令,然后再去处理bit;我们再看SETB C,它也是位操作,但在这里就不能把SETB看作一条完整的指令,它与C合起来才是一条完整的指令,所以我们在指令表中看到它单独对应一条机器指令,执行周期是一个时钟周期,而SETB bit是两个时钟周期,这样设计的目的不说自明。
前面说过,八位机机器指令最多只能做到256条,所以我们看到有些类汇编指令可以对R0、R1进行操作而对其它Rn不能操作,就是这个数量限制的原因,包括上面例子中说的位操作未能都按SETB C的规格做成一条机器指令,也是同样的原因。
结论:所以学汇编一定要熟悉了解机器指令。
扩展指令是怎么扩展的,没研究过。16位机理论上可以做到更多,但是,因为16位而可能会影响速度。
以上所说仅供参考,我所看的书上没有细说,也不知对不对。
作者: 51hei小明 时间: 2018-4-26 02:46
着是个值得思考的问题
作者: ahshmj 时间: 2018-4-26 08:59
每条汇编指令可以编译成 1个字节、2个字节或3个字节的机器码,所以汇编指令数不可能等于机器码数。
作者: 慢慢思考 时间: 2018-4-27 09:09
汇编指令数少于机器指令数的原因,是汇编语言的编制者在编制时对机器指令进行了归类。这种归类自有其合理性,但却未对其进行充分的说明,如果我们不看机器指令或是看了后不分析,真的会让人对汇编指令犯迷糊,所以,如果我们说汇编指令也是255条而与机器指令一一对应,那许多不好理解的地方立即就明白了。
作者: zl2168 时间: 2018-4-28 12:00
你想说明什么问题?什么叫充分说明?充分到什么程度?对不同基础的人来讲,“充分”的标准是不同的。明
作者: ohou524 时间: 2018-4-28 13:37
说得对
作者: 慢慢思考 时间: 2018-5-4 08:41
的确,充分的标准是不同的。
目前单片机有关汇编语言的教材中,有些问题没说清楚,这会导致学习难度加大,如有关Ri一说,只说了是这样,但没说为什么这样,然后我们就只能死记。类似的情况还有一些。
还有,有关对伪指令的解释,看了一些书都是不全面的,它并非如书中所说是标记,而是烧写工具在烧写程序时用的,如ORG,烧写工具会根据这个指令后面的数据,在程序存储器的第一个位置写入跳转指令,再按这个数据所指地址处开始烧写所有程序;END的作用是让烧写工具知道所有程序已经写完了,然后烧写工具据此作一些处理比如说在程序末尾写入机器约定的结束机器指令、向用户发出烧写结束后的一些信息等等。据此,个人认为称其为“伪指令”不太合适,可以称为“烧写指令”。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |