现在的位置: 首页 > 综合 > 正文

汇编三步学习法(个人总结)

2019年05月17日 ⁄ 综合 ⁄ 共 3295字 ⁄ 字号 评论关闭

今天写一篇博客吧,如果写的不是太好,还请大家见谅,这篇知识纯自己的学习感悟,不喜勿喷,大师我们一起学习嘛、吐舌头

自己只是把自己经过大三上一学期的汇编学习感悟写出来,没有再去参考复制啦,只是自己的一些感受,纪念一下所奋斗的一些东西

其实不论是汇编,还是51,avr,32都是差不多的,只要一通百通,无非是先分析底层硬件,然后针对相应的管脚,总线,寄存器做相应的处理,只不过后者的一些渐渐趋向于顶层的开发:先是高级语言,然后继续分层,库开发,哈哈,这些逐渐奔向应用的开发啊!微笑

废话不多说,从汇编的入门开始说吧,看个图先:

第一:我们首先要知道语言的产生,计算机语言,大概上可以分为三类:机器语言,汇编语言,高级语言。

                                               1.机器语言:也就是我们平时常说的0,1代码。不同的0,1代码,对应着不同的机器指令。计算机通过解析这样0,1代码,产生了不同的高低电平,从而驱动计算机中的部件进行相应的运算。(当然不同的CPU对应有不同的指令集)

            2.汇编语言:正是因为人们看到了机器语言太麻烦从而产生了汇编。汇编语言和机器语言的主要差别在于指令的表示上。汇编语言用到了伪指令这样的东西。汇编指令和机器指令一一对应

            比如说这样一条汇编指令:MOV AX,BX 它表示把寄存器BX的内容送到AX寄存器中;而其对应的机器指令是1000100111011000。我们看到,比起机器语言的0,1,汇编语言这样的形式更接近我们的自然语言,更容易记忆。

            3.高级语言,比如c语言,在硬件与软件交互开发时用的最多。C#(没学过),VB基于控件开发的;C++,JAVA这些面向对象的;PHP,ASP,JS,.NET等等这些高级语言,朝着不同的方向衍生不同的表象,但是,我们作为程序员不应该被这些吓到,高手都明白:只要一门语言学好了,学习其他的都是一通百通的,扯的远了。

第二:了解几个基本的与汇编结合很紧密的硬件术语。

我们知道,内存中存放的全都是0,1这样的东西,根本没给这些0,1加任何标签说谁谁谁是指令,谁谁谁是数据。例如二进制1000100111011000,计算机可以把他看作89D8H这样的数据来处理,也可以解析成为指令MOV AX,BX来执行。

 
一条机器指令执行分三个阶段:取指令阶段,分析取数阶段和执行阶段。

                                                 其中的取指令阶段就是把内存中的数据取到CPU中的指令寄存器;然后就是分析取数阶段,分析这个寄存器的数据,看看他是哪个指令,这个指令要从内存还是寄存器中取什么数,接着立马根据其相应的寻址方式,再到内存中取数据,放到相应的寄存器中;最后就是执行阶段,把取回来的数据进行相应的操作和运算。

                                                 所以,一个内存中的数据,到底最后被当作数据还是指令,全看它是在哪个阶段被读走。 当然,按照我们一般的程序装入的方式,我们的程序是在一个连续的内存空间的,指令在一个段,数据占一个段。

 
         为了方便存取,存储器被划分成若干个存储单元,存储单元一般是从0开始编号,每个存储单元可以存放8个bit,组成一个byte。大容量的存储器还用到更大的单位,KB,MB,GB,TB。 

         CPU要读或者写一个内存位置的数据,先要给出存储单元的编号,然后才能进行下一步的操作。 比如我要先给出地址0003H,说明我要操作的存储单元的编号;接着CPU发出相应的控制信号,说明我是要读这个单元的信息还是要向这个单元写数据;最后,我要读数据,就给出我要把这个地址数据存储的具体地址给出来,比如给出AX寄存器;或者我要写入,就要给出我要往这个单元写的数据的内容。

 
这里还要提到总线,上面讲到的地址信息,数据信息,控制信号,都是要通过总线,按一定先后顺序,从CPU传到相应的部件。总线也就是一种导线。

 
 这条指令的顺序是这样:首先,CPU通过地址线,把3号地址的信息传到内存;然后CPU通过控制总线,发出读信号,告诉内存我要做读操作;存储器做出相应的响应,就把3好地址的数据,通过数据总线,打回给CPU。

 
写操作也是类似的。
 
这是说明了CPU是如何执行读写指令的。我们写程序,就是要让CPU做出一系列我们希望的这些操作,完成一个任务。计算机是需要一系列电平的变化来产生相应的硬件反应的。所以我们的程序最后的内容应该就是一系列这种电平的变化,就是相应的0,1代码。

 
例如对于8086CPU,机器码101000000000001100000000对应的操作就是从3号单元读数据到AX寄存器。看到上面的机器码,计算机就会完成对应得操作。但是机器码太难记,于是我们的汇编语言把它简化为MOV AX,[3]。

现在,我们知道CPU通过地址总线来给出相应的存储单元。也就是说,地址总线可以表示多少个不同的信号,就决定了CPU最多能确定多少个不同的地址。而一根导线,可以传送的稳定状态就是高或者低电平,对应到二进制就是0,1。也就是一根导线可以表示两种状态。如果有10根,就可以表示2的十次方中不同的信号,对应2的10次方个内存单元。地址线的根数,通常叫做地址线宽度

CPU通过数据总线,来完成数据的传输。数据总线的宽度决定了数据传输的速率。比如数据总线宽度是8,这样一次可以传输8bit的数据,也就是一个字节。16位宽的数据总线一次可以传输2字节。这里举例来说明,两种总线宽度的CPU在传输数据89D8H时的不同。我们要注意到,8位数据总线宽度的传输顺序是先传低位后高位,这个顺序也会在以后的debug看到:

       内存地址空间是指CPU可以寻址的存储单元的。地址线宽度为10,则可以确定1024个不同的存储单元,这些个存储单元构成了这个CPU的内存地址空间

      各类存储芯片:从读写性质上,存储芯片可分为随机存储器RAM和只读存储器ROM

       上述这些存储器,物理上是独立元件,但是他们都通过总线和CPU相连,CPU对他们进行读写操作的时候都是发出内存读写命令。这也就是所谓的外设与内存统一编址。也就是说,CPU在访问这些设备的时候,都是通过内存地址进行的,这些存储器一同构成了一个逻辑存储器,而这个逻辑存储器就是我们说的内存地址空间。在汇编中,我们的要面对的就是这个内存地址空间。

第三:掌握汇编语言

现在简单总结汇编语言指令的分类:

1、数据传送指令;2、标志位操作指令;3 、算术运算指令;4、逻辑运算指令;5、移位运算指令;6、位操作指令;7、比较运算指令;8、循环指令;9、转移指令;10、条件设置字节指令;11、字符串操作指令;12、BCD码运算调整指令;13、处理器指令。

(在编写汇编程序时,应该注意特别容易出现的错误,例如在编写数据传送指令时,目的操作数和源操作数的类型一定要匹配)


汇编语言的寻址方式有直接寻址,寄存器寻址,基址变址寻址,相对基址变址寻址等等,掌握这些都是编写汇编程序很重要的环节。


汇编语言中的程序结构,子程序等知识也会帮助我们编写出一个更加完善的汇编程序。另外,我们还应该掌握DOS系统功能调用,宏汇编等知识。这里要对子程序和宏汇编加以区分,我的理解是:子程序是调用,而宏是替换,比如一个MAX宏,所有出现MAX的地方,都用宏代码代替。

不知道怎么说啦,反正如果学习汇编的话,比如底层的指令,硬件,时序图一定要搞懂。然后就是在语言程序设计方面,逻辑和架构的设计,逻辑就要考验你的逻辑思维能力了,二架构可以通过函数和宏定义实现模块化。再然后就是DOS命令的使用,在上课是我们只是对一些简单的学习了额,反汇编什么的,以后有机会就在这条路上走得更远一些,学会总结,哈哈

关于汇编常用指令本来想附在下面的,结果看太多了,发到共享吧,纪念大三上的生活,关于考试,尽力了都好,开心点奋斗

抱歉!评论已关闭.