51单片机进阶开发(二)之单片机底层逻辑

控制/MCU

1879人已加入

描述

单片机底层是怎么运行的

汇编可以说是编程语言的鼻祖,说句不好听的话程序员不知道一些汇编知识还真算不上是真正意义上的程序员。汇编语言是举例机器语言最近的编程语言,各种控制芯片的底层执行原理就是一堆机器代码在控制着一堆逻辑器件。他们是怎么运作的呢?接下来我将以51单片机为例来尝试将它们关系理顺,让你喜欢上编程这种有趣的工作。

还是从微机原理讲起

为啥要从《微机原理》说起呢?因为它是一本纯粹讲解计算机底层系统的的基础书籍,很多有关计算机原始设计的知识都可以在这里找到答案,所以建议大家如果对计算机系统不太熟悉应该多看几遍,有些东西看着看着就会了。当你愿意静下心来看书籍的时候某些书本上没有的答案你才会主动去寻求解答,我觉得这才是真正有意义的大学学习过程。其实我们的大学教材很多是不完整的,特别是基础性知识,可能在注解或文后参考文献才会有些提示。有些知识点你就不可能在教材上找得到答案,而是要去图书馆或者官方手册或网站查询才能获得解释。

我并不是说编写教材的人水平有问题或做的不对,恰恰相反,能作为高校教材的经典的书籍,编者的水平在国内绝对是该领域有名的专家。他们出书安排的本意也是希望学生能够自主学习,多去了解,拓展知识,毕竟教材的厚度有限,知识日新月异,涉及的几乎无限。大学本应该是一个自主求学的地方,那些老教授他们当初是在基础条件匮乏的环境中突破一层层障碍成长起来的,写教材也肯定用心良苦。

只是他们的教材传到学生手里就变成一部分人要依赖老师划重点才能及格的境地,这种情况持续时间长了,就总会有些是原来学的马马虎虎的学生来学校当老师了,本来自己没整明白,学生似乎也不太想整明白,到最后教的内容就只能照着书本找答案了。当然肯定不是所有老师都这样,在教学的过程中很多年轻老师还是随着资历提升授课水平也不断提升,前面的少数代表不了整体,所幸我在大学遇到的老师都挺好,只怪自己当初不给力,没能得到真传,今天刚好又是教师节,祝福天下老师节日快乐!

linux之父linus在大学期间设计出了第一版linux系统,我只能说他真是天才般的存在,那时的条件与我们所处环境相比,几乎一个人完完整整设计出了一整套系统,所需脑力何其巨大!在校时我还专门读过他的源码,即便一共只有万把行代码,很多都难以理解的,看了这页忘了那页都是常事,最后也没领会它的真谛,没过多久就忘得差不多了,现在若有人叫我去看他的源码,我会直截告诉他,算了吧,我真不是那块料,我还是干好我的本分事吧。有兴趣的朋友可以去看看他的代码,但是不建议初学者看,至少能熟练运用C语言,有汇编基础才能看,否则对你学习百害无一利!

《微机原理》这门课程中主要是以英特尔的80x86芯片介绍来计算机的底层原理,一般情况下,计算机,电子相关专业的同学在完成计算机基础和C语言(或其他某高级语言)的学习之后,就会从微观方面来学习计算机系统。《微机原理》中就会介绍计算机的数制、编码,CPU的由来,以及内部功能结构,然后就引出了80x86芯片,这些内容结合已学的知识多数人都应该容易理解。

微处理器

上面这个图很眼熟吧,51单片机也有类似结构,接着课本就进入到了80x86指令系统的介绍,觉得《微机原理》很难的同学应该就是从这开始迷茫的吧,什么立即寻址,直接寻址,寄存器间接寻址,基址变址寻址等等一大堆让人头疼的概念。外加各种指令,操作符,又是地址,又是内存,又是寄存器,存储单元的,这些看这都够眼花缭乱了,老师还叫你背下来说期末要填空,不是要了老命吗,对不对?练习题里给你一段代码然后给出如下图这样的示意图,问你能不能整明白啥是啥,啥等于啥?这能不晕?老师都能给你真晕。

微处理器

看了上面的举例看晕的没?如果看晕了那我的目的就达到了,接下来我接给你整明白它。

接下来

汇编语言怎么对应机器语言

上面说了这么多汇编语言相关的内容越说越迷糊了,要解决疑惑,首先来认识一下维基百科对汇编语言的定义。

汇编语言(英语:assembly language:汇编语言)是任何一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。

从定义可以知道的信息是:汇编可以存在于任何一种带控制功能的芯片中,但每种控制芯片支持的汇编语言不一定一样!为什么会这样呢?芯片厂商设计一款芯片定义它的逻辑功能的同时肯定就定义好了它的操作指令,所以现在我们会听到有各种架构的芯片存在,每一种架构实际都是一套指令系统,比如80x86,MIPS32,8051,AVR,RISC-V等等各种指令集,芯片厂商可以提供汇编指令集给使用者,但使用者也可以自己定义汇编指令,当然这些使用者都是大厂啦,我们这些普通用户就直接用厂商提供的就足够了,像微机原理和51单片机的汇编指令都是Intel自己定义好给我们的。这也就是我们之前说的汇编语言的局限性,不方便移植,今天我们就不追究这些了。

好了,再看后面一句标红的文字,意思就是每种芯片的汇编语言都对应器上面的机器语言的指令,这句话才是我们搞清楚汇编语言的与机器语言关系的关键所在。简单的说就是我们写的每一句有实际意义的汇编语句它就对应一个机器码,也就会对应一个机器指令,CPU就根据这些连串的机器码执行一系列的机器操作,这就是我们写的程序执行结果。先记住这句好,具体的对应关系看后文一一介绍。

那什么是有意义的汇编语句呢?他们就是汇编语言指令,也就是你不乐意记的mov,add,inc,jmp等等,那么对应的就有一些无实际意义的汇编语句,我们所说的汇编伪指令就是了,比如db,dw,equ等等,这些语句一般用来定义变量,或做指示,标识用,是起辅助作用不参与程序运行。

我们都知道,我们的51单片机是8位机,所以它内部的操作码就有8bit,也就是说它内部最多可以有2^8=256个操作码。现在汇编指令确定了,操作码总数确定了,剩下的就是一个萝卜一个坑式的填充它们之间的对应表了吧。

那究竟这二者之间的怎么对应的呢?

我们可以查看一些芯片的官方手册,专业一点的厂商都会列出这些信息,有些书籍上也会有,但一般再附录中出现,并且内容不会很详细,所以平时查看还是以官方手册为准。我这里贴几个图展示说明一下。

微处理器

这是STC数据手册中的指令集说明,信息是挺多的,但我们似乎还是找不到这些对应关系,但是我们可以看到这里列出了每个汇编指令结合各种寻找方式,那机器码应该与这些有关吧。接下来我们继续找资料挖掘:

微处理器

可以看到,这里发现了代码二字,看来离目标越来越近了,我们是不是应该多看看英文资料呢?

微处理器

果然还是能找到信息,现在这个表就把他们关系都对应上了吧!有些人可能还是看不懂这个表究竟怎么读,举个例子,nop指令,位于第0行第0列,组合来它对应的机器码值就是0x00,同样的,ajmp指令位于第0行第1列,组合码就是0x01。看明白了吧,就是一个二维数组。每个指令的各种寻址操作都在其中一一展现,根据前面手册中的信息就可以得到完整的对应表了。这么看这个表还正有点容易犯迷糊。我们可以再做得简单易懂一些。

微处理器

看这个表就简单多了吧,当然这里例举的只是部分表格内容,详细表格内容不较多,不好全截图,现在这些资料没有整理到云盘,后面再找个时间统一处理一下,分析链接出来,近期需要这些资料的朋友可以私信或留言,我直接发文件。

现在我再来举个例子来说明一下,大家应该就可以更好的理解它们。

微处理器

现在看到这条个图你会怎么想?你是不是首先想到去看mov指令的规则?解释这句代码的意思,这傻子都知道的吧。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分