找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机的汇编其实是最容易学会的一种语言

  [复制链接]
跳转到指定楼层
楼主
ID:266429 发表于 2023-3-19 21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        比如说,你在P2端口接了8个灯,然后你想让这8个灯间隔亮灭,要做到这件事,对于标准的51单片机来说,就是把01010101或10101010送入P2端口就行了,汇编很简单,一个命令,直接送:
ORG 0000H
START:
        MOV P2,#10101010B
END
        编译、下载、运行,完事。
        第一条ORG 0000H,并不是单片机要执行的内容,是告诉编译器,以下程序编译成二进制代码后,存在程序存储器中的位置,是从0000H这个地址开始的。
        第二条START,这个也不是单片机要执行的内容,而是告诉编译器,下面的内容是正式程序的开始。
        第三条MOV P2,#10101010B,这个就是单片机要执行的动作了,这个动作,就是把位于此条语句最后面的10101010B这个字节,送入P2这个单元之中。语句中的#,表示这个数据不是地址值,而是一个要直接送到接收单元的数值。
        第四条END,告诉编译器,后面没有程序了,编译任务到上面那句就结束了。
        其实第三条的写法,有两个问题,第一个问题,单片机是不认识什么P1、P2的,它只知道数据,因为在单片机内,不管是存储数据还是处理数或者是进行功能设置的所有的单元,都只是用数据编制了地址,你得给它数据地址,它才能去找这个单元,所谓的P2只是我们编程人给这个端口取的一个好记的俗名,它的实际地址,我们可以查表,知道是0A0H。这里我们用了P2而却通过了程序,原因在于我们所用的编译器之中,事先已经把P2这个俗名,与0A0H给联系起来了。如果你的编译器里没有给联系起来,那么这条语句可以这样写:MOV 0A0H,#10101010B,当然,一般我们会在程序前面给它起一个好记的名字,也就是定义;第二个问题,单片机也不认识什么MOV,它还是只认识数据,单片机中的所有命令,都是以数据的形式来表达的,通过查表,我们知道这个命令的值是75H,之所以写成MOV也以通过程序,也是因为编译器把这条语句整个看完之后,将其与75H给联系起来了,为什么说编译器要看完整条语句,因为其中的#会影响到编译结果。
        于是,整个程序在编译之后,就只有三个字节:75、A0、AA,这个可以在STC下载器中观察到。所以,如果你想直接用数据编程而不用MOV什么的,这第三条也可以这样写:DB  75H,0A0H,0AAH(就是10101010,不需要#),这里的DB也不是单片机要执行的工作,而是告诉编译器:这个后面有一些数据,这些数据嘛,你不用翻译了,直接照抄就是了。
        再解释一下这条指令中的75H,这条语句表达了一个单片机要执行的动作,而75H则是表达这个动作的全部具体内容(75H称作这条语句或者命令的操作码),它的具体动作内容,就是把存储在它本身位置之后第二个单元中的数据,作为直接数据而不是地址,送入一个片内数据存储单元之中,这个接收单元的地址值,就存在紧随操作码单元之后的的程序存储器单元之中。75H还有一个含意,就是表明在其之后的第三个单元之中存放的是下一条操作码。
        为什么说51汇编很简单,因为它的设计就是按人做事的一套方法程序来的,我们之所以觉得学起来难,是因为一是现有的教材没按这个思路来;二是汇编这个编程工具估计是个机械男做的,不太合我们的习惯;三是现有中文教材中一些名词起得,太不接地气,比如说所谓的数据总线这个名词,很不符合中文的表达方式,其实它就是单片机内各单元之间传送数据包括指令的公用通道,大家都可以用,为什么称为公用通道,因为有些单元之间是有私用通道的,目的是为了快速运行,所以,你觉得这个名词该如何取才最容易一看就懂而又简洁?还有就是特殊功能寄存器这个名词,也让人看不明白,其实在51机教材中它大致包含三个部,一个部分就是端口控制单元,一个部分就是单片机功能设置单元,还有一个部分就是运行状况标志单元。
        单片机的工作,基本就是操作各个存储和处理数据的单元,以及为调整单片机的功能对功能设置单元进行设置、对标志单元进行处理等等。要操作某个单元,首先就是要找到其地址;对于不同单元之间的数据传输,则在找到其地址之后,就是查单片机的设计手册,看其对这两个单元之间的传输是如何设计的,要做到这个,一需要知道存储器的物理种类,51机有程序存储器、片内数据据存储器、片外数据存储器三种物理区分。二是要知道所有存储器的地址编制规则,51单片机中,程序存储器自己单独一套,地址编号从0开始,最大65535,最多65536个单元;片内数据存储器有点意思,也是自己一套,从0开始,最大255,可它最多可以有256+128个单元;片外数据存储器也是自己一套,从0开始,16位地址也是大65535,最多65536个单元。三是要知道该单片机所设计的单元的地址表达方式,这个说起来比较长,具体可以结合几种寻址方式来理解,51机可以在操作码后面的数据(操作数)中指出,但必须要在操作码中指出后面的操作数指的是什么,象我们上面所举例子,操作码就明确指出了其后第一个操作数是接收数据的单元的地址,第二个操作数是要直接传给接收单元的数据,也就是说被传输的数据的地址在操作码所在程序存储器单元之后的第二个单元之中。
        这里说说片内数据存储器的怪,其缘于其编址的方式虽然是从0到255,但128以上高128个单元却分为了两个物理存储部分,这两部分地址编号是一样的从128到255,但以不同的寻址方式来区分,教材所称的特殊功能寄存器部分只能采用直接的寻址方式,而另一部分则只能用间接寻址方式来操作,这部分完全交给用户用作在运行过程中存储数据,也所以,51机中用户可以操作用来存储数据的片内数据存储单元是256个。
        另外说一句,不同的单片机有不同的设计方式,比如说对于STM32,对于其单元的编址,不管什么存储器种类,它是统一编址的,全部在0到4G这个范围内。
PS1:说句有争议的话,从汇编入门51机包括其原理很容易,初中文化就可以了,可惜的是没有合适的教材。
PS2:只取不予是不对的,于是特懒的我,写了这点东西,算是对本坛的回报,嗯,花费三个多小时。
PS3:提一个观点,单片机就是个电子电路,它不认识什么数值数据,也就是并不认识什么0什么1,它只是人类利用了电子电路的电平高与低这个特征来设计的一个功能性电路,所以,它只知道电位高低。由此,提一个建议,在对“特殊功能寄存器”进行操作时,为了便于理解,可以不用什么十进制十六进制,而是直接用二进制,好理解好修改。
      不正确不恰当的地方,敬请指正。

评分

参与人数 3黑币 +70 收起 理由
STC庄伟 + 5 赞一个!
ldc2000 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:163285 发表于 2023-3-19 22:15 | 只看该作者
通俗易懂,继续加油!
回复

使用道具 举报

板凳
ID:401564 发表于 2023-3-19 23:05 | 只看该作者
在我没用C语言之前,我也觉得汇编有种种的好
在我用了C之后,我就知道为什么,绝大多数的公司对汇编是没有要求的,会不会都不重要
就算是有的时候.汇编能做一些C做不了的事,比如精确到一个时钟的精度,比如在只有几百B的单片机上写出一个能批量生产的程序
但我还是可以告诉你: C可以完全取代汇编,会不会汇编,都不会影响一个人在单片机领域的水平,不会汇编的人大把的,人家一样能写出好程序
但你不会C,那你在单片机领域就只能停留在上古时期的水平
回复

使用道具 举报

地板
ID:149799 发表于 2023-3-20 07:10 | 只看该作者
楼主讲到单片机的内核了,通俗易懂,谢谢分享知识,继续加油。
回复

使用道具 举报

5#
ID:266429 发表于 2023-3-20 08:21 | 只看该作者
     不管你是用哪种单片机,编程的主力仍然是C,但做单片机应用设计的人,不懂其原理的人与懂其原理的人,水平能力自然不可同日而语。本人当初也是从C开始,但用着用着,就有了很多不明白,不明白为什么要这样做,觉得用C就是隔靴搔痒,于是就去试着理解单片机芯片的构成与原理,知道了其构成与原理,自然也就不愿意用C了,因为用汇编很直接,闭着眼睛就能做出程序,当然,这样的程序都不大,程序如果大了,汇编就显得麻烦了,它的麻烦主要的还是在于人的脑力不够用。
      竞争的时代,想要自己的水平超过别人,想要自己的水平达到一个很高的地步,芯片级原理的学习是一条很有效的通路,而一旦你明白了其原理,汇编不过是水到渠成的事。
回复

使用道具 举报

6#
ID:266429 发表于 2023-3-20 08:23 | 只看该作者
在C里面,指针是个很骚的东西,如果你只会C,想理解透彻这个东西有点难,但如果你懂了芯片级原理,则有助于你理解及应用这个东西。
回复

使用道具 举报

7#
ID:266429 发表于 2023-3-20 08:26 | 只看该作者
光说不练 发表于 2023-3-19 22:15
通俗易懂,继续加油!

谢谢夸奖,我的本旨,就是想用通俗易懂的语言和比喻来描述单片机。如果大家认为我写的东西有不清楚和不容易看懂的地方,希望大家指出。
回复

使用道具 举报

8#
ID:266429 发表于 2023-3-20 08:56 | 只看该作者
      说起51机的原理,其实是很简单的东西,它只不过是一种思路,是对我们做事习惯在提炼之后的应用,初中生就能够理解。但为什么普遍认为这个很难,那是因为教材的原因,我手上光纸质书就有九本,但对原理的讲解,都只是告诉我们是这样的,却从没有一本书是讲解为什么这样的,可以这样说,这些书,目的只是想教大家编程,而没有培养芯片设计人员的意识。
      比如说有关计算机认不认识数字的问题,都是直接说它只认识0和1,但我们要知道,它不过是一个电子电路,它只知道电压电流电阻开关之类的,根本不知道什么0和1。电路的电压从0到电源电压值有无穷的状态值,我们只抽象地取了一个高电位和一个低电位两种状态,以此两种状态来建立一个二进制类模型,依据数学公式来设计出相应的运行电路,让其运行出与数学计算结果具有唯一对应电位状态的电路体系。
      从理论上来说,任何能取得稳定两种状态且能稳定进行转换的自然界物理现象,都可以用来设计制作二进制计算工具,如果能取得稳定十种状态且能稳定进行转换的物理现象,那就可能用来设计制作十进制计算工具。这个概念,属于一名计算工具设计者应该具备的概念。
回复

使用道具 举报

9#
ID:1063388 发表于 2023-3-20 09:25 来自手机 | 只看该作者
楼主把51编程底层说的清楚易懂 ,为主点赞
回复

使用道具 举报

10#
ID:230500 发表于 2023-3-20 11:02 | 只看该作者
入门还是从C开始吧;C语言更加流行一些;汇编有多余时间学一点也是可以的; 如果不会汇编也是完全没有关系的;不用太过在意!
回复

使用道具 举报

11#
ID:266429 发表于 2023-3-20 11:29 | 只看该作者
a399288395 发表于 2023-3-20 11:02
入门还是从C开始吧;C语言更加流行一些;汇编有多余时间学一点也是可以的; 如果不会汇编也是完全没有关系 ...

入门从兴趣开始,成就高低靠基础牢靠程度,基础不牢楼房就做不高,建房速度靠的是所用的工具,对原理的理解就是基础,汇编不过是在理解原理之后顺手的事,建房讲速度方面C是当然的主力。
汇编可以不用专门去学,但原理与结构是一定要学的,学了原理与结构,在底层操作时,反正本人是不愿意用C的,想用C合在C中嵌入汇编就是了。
还有,学了原理与结构之后,你想转其它的单片机,比你只知道C要容易得太多。再说了,转其它机是很平常的事,毕竟51机的资源和速度还是有些原始。
回复

使用道具 举报

12#
ID:139866 发表于 2023-3-20 17:06 | 只看该作者
学会了基本原理,你可以用汇编直接送数据到地址, 我也可以用C直接往地址里写数据,而且我用C不光可以直接写数据,还能封装函数,更快捷更方便,汇编不是主流是有原因的。
学习这东西,不论是C还是汇编,都仅仅是个工具,,如果把工具的优劣当成个人能力的标准,是不合理的,
重要的是芯片的手册,跟某个芯片有关的程序全部都是按照相应手册来写的,C跟汇编都是过程工具,仅此而已。
回复

使用道具 举报

13#
ID:73992 发表于 2023-3-20 17:16 来自手机 | 只看该作者
站在研发的角度,学习汇编语言,与学习自然科学一样。一边追求本质,一边探索未知。每走一步都需要谨慎与耐心。但是每一个成功,都会增加一点科技创新。我现在写的程序,已经接近了4k,就是程序总要回望,与省视,虽难受比较。但正是这个过程,容易让一个人成为软硬件方面的工程高手。我喜欢用汇编,也喜欢研究自然科学。汇编的开发流程,与研究自然科学的流程类似。就是说更容易创造新的东西。所以我很赞赏楼主对汇编的理解。
回复

使用道具 举报

14#
ID:266429 发表于 2023-3-20 18:23 | 只看该作者
天ノ忆 发表于 2023-3-20 17:06
学会了基本原理,你可以用汇编直接送数据到地址, 我也可以用C直接往地址里写数据,而且我用C不光可以直接 ...

      是的,所以学懂原理才是根本。不懂原理,做程序时就只能照抄别人的程序,合适不合适不知道,有没有问题不知道,有没有多余的语句不知道,怎么变通不知道,出了错怎么查知道得不多,问了别人修改之后为什么能通过不知道,学习起来多靠死记硬背时间一长忘得一干二净又得从头查资料。
      说到封装库,并非汇编不能,它也能做,ARM的用汇编制作的启动文件就是一个封装库,只是现有的汇编及编辑器在这方面的可操作性实在不能跟C比,汇编这个工具真是不长进,当时就设计得很死板很初级,这多年了,就这一版,死活没有改进。
回复

使用道具 举报

15#
ID:1074735 发表于 2023-4-29 23:28 | 只看该作者
我也准备学C
回复

使用道具 举报

16#
ID:1074495 发表于 2023-5-1 18:00 | 只看该作者
汇编主要是基于硬件的语言,相较于C语言,想要学好汇编对硬件的理解要通透
回复

使用道具 举报

17#
ID:1075036 发表于 2023-5-2 23:22 | 只看该作者
通俗易懂,继续加油!学到了
回复

使用道具 举报

18#
ID:1041040 发表于 2023-6-12 12:43 | 只看该作者
通俗易懂,继续加油!
回复

使用道具 举报

19#
ID:1083793 发表于 2023-6-13 14:13 | 只看该作者
汇编会了不错,不会也行
回复

使用道具 举报

20#
ID:491875 发表于 2023-6-13 16:29 | 只看该作者
复杂一点的程序就够你头疼了
回复

使用道具 举报

21#
ID:1063561 发表于 2023-6-21 09:32 | 只看该作者
有时为了效率不得不用汇编编程
回复

使用道具 举报

22#
ID:1063563 发表于 2023-6-25 10:11 | 只看该作者
Y_G_G 发表于 2023-3-19 23:05
在我没用C语言之前,我也觉得汇编有种种的好
在我用了C之后,我就知道为什么,绝大多数的公司对汇编是没有要 ...

回复

使用道具 举报

23#
ID:641483 发表于 2023-6-26 13:58 | 只看该作者
慢慢思考 发表于 2023-3-20 08:21
不管你是用哪种单片机,编程的主力仍然是C,但做单片机应用设计的人,不懂其原理的人与懂其原理的人, ...

楼主解释比较通俗易懂, 我是小白,看了很多视频教程和学习版, 都是朦胧的一知半解状态,就知道老师说一定要这样写(抄),为啥要这样,就不甚了解,要是能把工作原理了解清楚,就能更好理解程序语句,更容易学习了
回复

使用道具 举报

24#
ID:200844 发表于 2023-7-1 11:28 | 只看该作者
我也只会汇编,想学C,但看着感觉很复杂,就没心思认真去学了。不过想更高一个层次还是要用C来写,C现在也是主流
回复

使用道具 举报

25#
ID:1085441 发表于 2023-7-4 00:19 | 只看该作者
除非对反应和时序要求非常高,还是用C写比较好,C51学习还是比较好上手,我当年看的是马忠梅的“单片机的C语言应用程序设计”
回复

使用道具 举报

26#
ID:333446 发表于 2023-7-12 12:05 | 只看该作者
Y_G_G 发表于 2023-3-19 23:05
在我没用C语言之前,我也觉得汇编有种种的好
在我用了C之后,我就知道为什么,绝大多数的公司对汇编是没有要 ...

我在30年前只会写汇编,写计算模块用了一个星期,现在用c,一个小时搞定。
回复

使用道具 举报

27#
ID:1090236 发表于 2023-8-1 09:43 | 只看该作者
通俗易懂,学习了
回复

使用道具 举报

28#
ID:1091289 发表于 2023-8-16 10:09 | 只看该作者
和我现在在学的PLC 编程很像
回复

使用道具 举报

29#
ID:463392 发表于 2023-8-28 19:53 | 只看该作者
感谢楼主把51编程底层说的通俗易懂
回复

使用道具 举报

30#
ID:994634 发表于 2023-12-18 21:30 | 只看该作者
还是从各种门电路学起吧!
回复

使用道具 举报

31#
ID:1100060 发表于 2023-12-23 08:16 | 只看该作者
市井闲叟 发表于 2023-12-18 21:30
还是从各种门电路学起吧!


用分立元件组装出整片8051来,用晶体管的估计有一张双人床那么大,如果用真空管,估计会有车库那么大了。
回复

使用道具 举报

32#
ID:1100060 发表于 2023-12-23 08:28 | 只看该作者
天ノ忆 发表于 2023-3-20 17:06
学会了基本原理,你可以用汇编直接送数据到地址, 我也可以用C直接往地址里写数据,而且我用C不光可以直接 ...


啊,手册,那就是芯片懂的语言,相当于 中外翻译字典。
比如我要〖这是一本书〗的英文版,就去翻 汉英字典,得到 this、is、a、book '这四个英文单词然后组合成 “this is a book” 这句话。
回复

使用道具 举报

33#
ID:1088185 发表于 2024-1-6 17:48 | 只看该作者
不会汇编只会C行不行,这要看你对自己的要求,只会C也能做大部分项目,但有些资源紧张的项目做不来。

而且对于某些C语言的规定不好理解,只能死记, 比如调用函数的参数应该尽量少, 太多参数就该把它封装传地址, 懂汇编的就不需要解释。
回复

使用道具 举报

34#
ID:619259 发表于 2024-2-13 21:55 | 只看该作者
学英语也很容易,不就是ABCD吗
回复

使用道具 举报

35#
ID:993578 发表于 2024-3-27 09:50 | 只看该作者
说起51机的原理,其实是很简单的东西,它只不过是一种思路,是对我们做事习惯在提炼之后的应用,初中生就能够理解。但为什么普遍认为这个很难,那是因为教材的原因,我手上光纸质书就有九本,但对原理的讲解,都只是告诉我们是这样的,却从没有一本书是讲解为什么这样的,可以这样说,这些书,目的只是想教大家编程,而没有培养芯片设计人员的意识。
      比如说有关计算机认不认识数字的问题,都是直接说它只认识0和1,但我们要知道,它不过是一个电子电路,它只知道电压电流电阻开关之类的,根本不知道什么0和1。电路的电压从0到电源电压值有无穷的状态值,我们只抽象地取了一个高电位和一个低电位两种状态,以此两种状态来建立一个二进制类模型,依据数学公式来设计出相应的运行电路,让其运行出与数学计算结果具有唯一对应电位状态的电路体系。
      从理论上来说,任何能取得稳定两种状态且能稳定进行转换的自然界物理现象,都可以用来设计制作二进制计算工具,如果能取得稳定十种状态且能稳定进行转换的物理现象,那就可能用来设计制作十进制计算工具。这个概念,属于一名计算工具设计者应该具备的概念。
回复

使用道具 举报

36#
ID:961114 发表于 2024-3-28 09:48 | 只看该作者
要学C,但是也得懂汇编
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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