之前玩过几款单片机,微机之前没接触,感觉微机可以作为单片机应用的一个基础,感觉是学了一款
CPU,其他的都很容易上手,本人对微机的认识很浅。对微机的理解也不够透彻,只是想谈谈本人对微机的一个认识,错漏应该不少,对微机原理的认识,各人有各人的看法,有错误的地方就说出来。本人不是在装逼,只是就微机这东西说说自己的体会,而且只是很简陋的体会。
单片机和现在你用的
PC机还有那些超级计算机其实是计算机的三个发展分支,是一个家庭的成员,所以他们有很多共同之处,但一个家庭各个兄弟都有各自的特点。
首先说一下我对微机的工作的理解,微机的最根本属性是一个数字系统,数字系统的任务是通过各种逻辑算术运算和控制操作来处理储存器的信号流,微机可以笼统地认为是一段内存储存器,和
CPU单元。其实
CPU是个低能儿,做什么事都要人指点去做。所以我们就把要
CPU做的事情写成指令,存放在内存里的代码段里,有
PC指针控制
CPU执行那个指令。而之前我说过了数字系统是处理信号流的,而这信号存放在数据段中。所以现在应该有一个大概的框架,
CPU通过读取内存代码段的指令(其实是二进制代码),然后它自己会通过翻译把指令得到我们要它做什么事情的一个命令,然后它就通过这个命令读取通用寄存器或内存里面的数据,然后交给
ALU处理,
ALU里面就是一些加法器比较器那些,是平时学数电学的那些电路,这些电路是没有记忆功能的,所以处理完后再把处理好的数据交给目标地址中,可以是内存可以是通用寄存器。这样就完成了指令操作,通过很多条这样的操作来处理内存中的数据,得到我们需要的数据。
对内存的理解,初学者比较难理解。我说说我的一些表面的理解。学数电时,我们知道内存是一个个触发器和译码电路组成,一个触发器可以储存一个二进制代码,而我们读取这些二进制数就要通过给地址端一个地址,然后通过译码电路定位这储存器,然后读取出来。所以每个内存单元都分为其触发器里面储存的代码,要读取这些代码就要有这个储存器的地址。而
CPU又会把这些代码分为代码段和数据段,代码段提供
CPU工作的指令在里面,数据段存放目标数据源,而指令改了程序就会改变,所以代码段一般是不能通过普通的寻址指令来读取的,有一个特定的读取指令,通常代码段是不允许修改的,只读的,
CPU的目标就是处理数据段中的数据,得到我们想要的结果。
说说汇编程序,汇编程序其实是写来给人看的代码,刚开始有计算机时,机器代码是
CPU能识别的二进制代码,可读性差,所以发明编译器来代替人来做这事情,刚开始的汇编语言跟机器语言很接近。用人认识的字母代替机器码便于人们的阅读。用任何语言写的程序编译后的目标代码都可以还原成汇编代码,
VC写的程序可以通过
debug反汇编回原来的代码。所以平时的所有操作都可以在脑中想好,然后想出相应的
C语言程序,把它想出相应的汇编指令就可以了。
如
if(a > b)a = b;可以翻译成汇编
MOV AX,AMOV BX,BSUB AX,BXJLE ENDINTMOV A,BENDINT RET这只是个简单例子,大家可以想想想
for循环,
while循环,还有
switch选择语句的各种汇编实现,只要控制好条件转跳语句和直接转跳语句,这些控制是完全可以实现的,特别说一下就是循环不一定要用
loop语句,可以通过条件转跳语句和相应的寄存器操作完成。
在
C语言中大家一般
喜欢用函数来完成一个特定功能,其实汇编中的子程序完成了这种功能,大家知道大部分操作都会改变标志储存器的内容,这个储存器在控制最好用
PUSH放进堆栈里面,子程序执行完后记得要调出
POP,
PUSH和
POP一定要成对出现。在
C语言中,函数都有形参,实参还有返回值,这是一个函数的一个基本要素。写汇编的时候可以人为地定义那个寄存器是形参,就是告诉用你函数的人(包括你自己),约定哪个通用寄存器(通用寄存器功能非常强大,要好好利用,所有的操作都可以通过特定通用寄存器来执行)用的时候传递目标内存地址上的数据到指定的寄存器里面,然后再调用子函数,再约定一个通用寄存器存放返回值,执行完后
MOV到内存里面,如:
D = sin(b);调用子函数可以写成
MOV AX, B ;约定
AX存放形参
CALL SINMOV D, CX ;约定
CX存放返回值
如果你想传址调用一个函数的话,可以把目标内存的地址传给通用寄存器,如:
LEA AX, DLEA BX, C这样就传递目标内存的地址给通用寄存器,在子程序中通过这些地址处理这些地址上的数据,由于子程序知道这些地址,所以返回值可以存放在内存中,改变内存中的数据,而传值调用只是改变通用寄存器的内容,对目标内存无任何影响。这个和
C语言的一样的。
其实发明
C语言的人是把之前人们在写汇编时的优秀经验借鉴到
C语言中,参考
C语言来写汇编写出来的代码逻辑性比凭自己意志写的代码强很多,逻辑错误少很多。
C语言能实现的,汇编都能实现。
对于指针和结构体还有数组来说,个人理解是指针是内存中的一个储存单元,其大小为
16bit,用来存放其指向的目标数据的地址,程序通过这个地址就可以找到相应的目标数据。
而指针如果随便存放一个乱码的话,那地址就是不定的,处理这个指针的目标数据的时候什么可怕的事情都会发生。
数组的话个人理解是内存中一段连续的储存器单元,而数组名则是这些连续储存器中第一个储存器的地址,我们有了这个地址就可以找到这些储存器。
字符和字符串我感觉是无差异的二进制数,不过人们为了方便就定义了
ASCII码来定义各个数字代表的不同符号,其实你在屏幕上看到的汉字也是这种形式存放的,字体的不同只是在其中加入了一些字体的信息,国家有一个国标码标(GB2312-80标准),而ASCII是存放美国定义的基本英文字符的一个协议标准,准来定义这些文字符号,回车等在屏幕上显示不出来的符号也是其中的一组符号。字符串是一串这样的数字最后以
0x00结尾的一串数据,程序可以通过判断这个
0x00来判断字符串的结束。
结构体可以理解为内存中一段连续的储存器单元,而这段储存器的不同位置有不同的意思在里面。
基本上面就是一些我对微机的一点点个人体会,有些体会是不知怎么表达出来的,各人自己慢慢体会,文章漏洞百出,条理也不好,各人有各人体会,希望指出改正。
文章评论(0条评论)
登录后参与讨论