最近一直忙着上课,一直忙着写论文,一直忙着准备考试,但是脑子没有停止思考。
下学是结合个人的学习经历,给希望学习软件的菜鸟一点点帮助。
1:菜鸟也想学编程
大部分同学从大学开始接触软件编程,但其实有一少部分的幸运的人会在高中,或是初中接触软件。他们在软件方面的启蒙教育会早于我们。当然这样的人还是少数,在中国这样的教育体制下,应试教育太严重。很少有人初高中就能机会去学习编程语言,然后写自己感兴趣的软件。所以大部分人接触软件编程还是从大学起。如何能不那么困难的学习编程呢?结合自己的实际经验,学习编程应该在思想上先做到如下认识。很多人一上来,就想做什么大型软件,操作系统啊,gui的软件啊。这样是否太浮躁了,计算机怎么运行的你都不知道,就想一步登天,一个字,难!从基础开始吧!那什么是基础啊?ok,下面就说说基础:汇编语言是基础吧,c语言是基础吧,计算机组成原理是基础吧,当然如果你是学单片机编程,那就看单片机原理吧。
上面的是基础,还真是基础,还有更高级的内容下面会一步一步提到。现在对上面的基础知识如何学习,做一些说明。
a:计算机组成原理:必须要先看的,你要对计算机or 单片机进行编程,肯定要了解一下这个硬件对象啊。但是学习计算机组成原理时,不要走误区,不要去背一些概念,要理解,当然你如果不理解也没有关系,看一遍有个大概念的印象。至少做到有这样的理解:计算机是由cpu,memoy(内存),disk(硬盘or SSD),还有输入(mouse ,keyboard等)、输出设备(screen、printer等)组成的。
对cpu的认识:做两种运算:加减乘除,与或非,(做运算时数据主要是在寄存器中),读内存数据到cpu内部,写cpu内部数据到memory
对memory的认识:保存数据,memoy就是内存条,容量很大,内存每个字节有地址,cpu通过这个内存的地址找到内存中的数据。内存的这个地址就是c语言中的指针,汇编中所说的寻址方式,就是如何得到内存的地址。(思考,内存为什么有地址,cpu的寄存器为什么 没有地址)
disk:就是我们说的硬盘,硬盘容量比内存大,速度比内存慢。用来存放大量的不是经常用到的数据,当然,包括os也是很在硬盘上的。
ok,上面是对硬件的认识,现在从较高的层次思考:
对于cpu来说只有类设备,一类是用线性地址寻址的内存memory mapped的方式 ,汇编中用mov指令来读写内存;另一类是用io端口地址的方式来访问的设备,如硬盘,mouse,keyboard,等全是这样的设备,汇编中用in ,out指令来读写这类设备。
所以cpu就是通过mov and out ,in来操作这些设备的。了解到这里就够了,不要想多了,后面不懂的慢慢积累,学习的过程就是这样的,一口吃不了大胖子。
有了上面的知识,下面可以学习汇编语言了,学习汇编很麻烦,好像做实验也不方便,而且也没有什么意思,写一个hello world都要费好大的劲。 能自己用汇编写一个hello world的人还算是有毅力了。好多人还没有开始写程序,就被搞汇编的语法搞殘了,本人曾经好像也是。其实是思想觉悟低了,想想不论是c语言,还是汇编语言,他们的核心都差不多:如何实现if,如何实现loop,还有如何读写内存,如何操作screen等外设。如果你是从这个层次来学习汇编语言,c语言,你会省好多事。为什么呢,这样说,写程序是一门实践活动,你要运手写,在入门的时间,不写代码是肯定不会的。等到了高手的阶段,要多思考,写代码就少了。就如同学自行车一样,你只想着怎么骑,别人也讲了很多关于怎么骑自行车的事,你还是不会,为什么,因为你自己要拿一辆车来骑骑,摔几次,你才有感觉。
写程序也是一样,但是程序语言有学习的套路,语法的东西是死的,不用自己强记,不记得了翻书,要学习的就是如何实现读写内存,如何对数据做+-x / and logic运行,如何把数据在屏幕上显示,如何用汇编实现if ,while这样的loop。
学会这些东西,你就学会汇编了。去记那些语法用处是不大的,因为你程序写多了,自然这些语法就记得了。为什么不让你记语言法呢,因为语法是人定的,没用太多理由,有的是为了方便,有的完全没有理由。记得有同学问本人,为什么汇编用mov,不用move,晕倒,这样的问题真心不想回答。因为这是发明汇编语言的人定的。(你要真要找理由,那就是英文简写都是去掉元音字母的,如果move 变成了mv,就不知道mv是什么意思了,所以写成mov吧)。我这只是举一例,学习汇编是,不要去想那些语法知识,没有意义。我们要学习的是如何读写内存,如果作if判断,如何实现loop就ok了。写程序时就只用到上面的内容。感觉说的有点多了。上面只是说看书时,如何学习汇编语言,但是实践学科是不能只看书的。下面说说用汇编来写写程序。汇编的优势在于对硬件的操作,所以还是直接操作硬件吧,这样对以后学操作系统,学bios,学习linux源码也是大有用处的。我的建议就是搞一台不用的旧电脑,直接在上面运行自己写的汇编代码。如果没有这个条件,就在虚拟机上折腾吧。
前几天本人在群中有此一言,买一台几百块的二手笔记本学习嵌入式,个人感觉没有什么不妥啊,但是好多人说不太可能。嵌入式编程就是从pc机编程发展出来的,有何不可?
如果你真有台二手笔记本,可以这样来学习汇编语言编程。(前提是这们二手本支持从u盘启动,bios中有设置)
1:在你的牛B的个人电脑or 笔记本上,写好汇编程序。写个在屏幕上显示hello world的程序吧,我下面用的是伪代码。
char *pt=hello world"
disp(pt)
//想想用汇编如何实现disp函数
思路:得到"hello world"的在内存中的首地址,然后读这个地址的内容到寄存器,
将寄存器中的内容送到显存,然后地址++,然后用if判断是否到了最后一个字节。
2:从上面的思路可以知道,我们要知道如何在代码中得到内存的地址,读内存的内容到寄存器,送寄存器的内容到显存,这些内容哪里不懂,就是去翻书,书上,网上都有。程序就是之样写出来了。先有思路,有伪代码,最后转化成汇编。
3:然后用nasm汇编器进行汇编后,就变成了可以执行的机器码了。
4:在linux下,用dd命令,把上面编译好的机器码,写到你的u盘第一个扇区上.(win下也有写u盘的软件,不过需要要好好找找)
5:取下u盘,插到你买的二手笔记本上,开机,在bios里面设置成u盘启动。这时你会看到在屏幕上显示了hello world
整个过程就是这么简单的,但是上面只是一个例子,只是对屏幕的操作,显示一个字符串而已,更高级的内容是学习如何得到按键的输入,如何读写硬盘,如何驱动鼠标。 这些实验就是x86上面的嵌入式裸机实验了。这些内容学习好了,就可以进行更深入的,关于计算机图形用户界面的编程,还有如何驱动usb设备等内容。这些知识的学习如果你只用汇编来编程,你会累死,当然如果你真的用汇编写出来这样的程序,你的汇编已经非常牛了。对于驱动更多的外设,你需要学习c语言了。因为汇编写起来太慢,不容易维护。但是在学习汇编,用汇编直接操作这些硬件的过程中,你会体会到汇编的强大,你会去学习x86结构16位模式如何编程,32位模式如何编程,这些知识对于你去学习linux的源码,是必须的。
所以从面的角度分析,我们用x86的二手笔记本来学习汇编语言的编程,用来直接控制keyboad,mouse,内存,硬盘等多设都是可以的。到了一定的阶段,你可以用汇编和c语言混合起来,写一个带Gui的bootloader来加载linux内核也是可能的。当然说了这么多,如果有谁愿意买台二手笔记本学习汇编编程,本人到是愿意教你一步一步的汇编入门。从基本的控制显示器开始,到u盘,到硬盘。
有问题需要交流请加:qq:397916230
用x86学习嵌入式编程,今天先讲到这里,未完待续..................................