最近有几天没有写学习笔记了,主要是汇编语言的学习比我想象中的繁琐,很多东西需要大量实践才能灵活运用,经过几天的实践我差不多熟识了一些基本的东西,所以呢!学习笔记继续!
计算机系统组成图
我们先来看看计算机到底由哪些东西组成的
*从上图我们可以看到,CPU通过系统总线访问主存贮器。然后也是通过系统总线访问IO接口并间接访问辅助存储器,输入和输出设备。这样一来CPU到IO到辅助存储器,输入输出设备,它的速度是由最慢的1个决定。因为IO啊,辅助存储器啊,输入输出设备啊一级一级的更慢,所以计算机采取了1个措施,就是预先读取一部分数据到主存储器中。因为主存的速度比辅助存储器快很多了。
汇编语言程序最关系的东西是什么呢?!当时是寄存器了。
寄存器
老汇编书上最常见的8个寄存器
AX BX CX DX SI DI BP SP
我其实学习汇编语言的第一天很害怕它,感觉好多个。每个又有共同点,每个又有通用点,又有它特殊的地方。感觉蛮繁琐的。不过几天后,我觉得这些只是1个练习的过程,刚开始不要刻意去记忆,在实践中练习中学习最有效!加油!它们有一个共同点就是暂时可以放一些东西。然后边往后学边去理解各个寄存器的作用。比如这个BP要结合到函数才能深刻的学习。我们可以这样理解,我们身边有8个金刚罗汉。他们都有共同点就是都很能打坏蛋,但是他们的武功又有所不同。
调试程序debug
*debug是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令,跟踪程序的有效手段。
*debug常用命令:-A 汇编 -U 反汇编 -T单步执行 -G 断点执行 -D 数据显示 -R 寄存器
最近学汇编进度慢了不少,主要是时间是花在了debug的实践上。
8086内部结构
哇!好晕,不过再继续逐步结合寻址方式学习,就会觉得很简单啦!
8086内部结构对于程序员来说什么最重要:
最重要的是寄存器组:*8个通用寄存器 *1个指令指针寄存器 *1个标志寄存器 *4个段寄存器
下面分别来学习下。
8086的16位通用寄存器组:
AX BX CX DX SI DI BP SP 共八位虎将啊!有的精通做加法,有的精通做基址定位,有的作为循环控制,有的作为访问端口等等。我们挨个进行学习、现在我们要知道这几个寄存器可以暂时放东西。前4个ABCD数据寄存器还可以分为高8位和低8位,也就是分成了AH BH CH DH AL BL CL DL也就是高字节,低字节,而且对其中某8位的操作,并不影响另外对应8位的数据。我们在选择寄存器的时候要多用AX,因为处理器厂商宣称对AX有硬件优化。它本来是作为加法器的,加法器在CPU的地址是很重要的。只要把加法优化千分之一,整个程序的性能就上去了。
数据寄存器各自专业目的简析
*数据寄存器用来存放计算机的结果和操作数,也可以用来存放地址。
AX-----累加器,使用频率最高,用于算术,逻辑运算以及对外设传送信息的等等,加上处理器厂商宣称对其进行了硬件优化。所以首选。
BX-----基址寄存器,常用于做存放存储器地址、这个我暂时还不懂,以后学到了就会明白啦!
CX-----计数器,作为循环和串操作等指令中的隐含计数器,有些我们代码需要循环的啦!通过检查 CX知道是不是应该退出循环了!
DX-----数据寄存器,常用来存放双字长数据的高16位,或者存放外设的端口地址。有时候我们做乘法结果超过了寄存器的容量,那么超过的高位就到了DX中去啦!
现在我们都先记住这些基本概念啦!
变址寄存器
当我们要处理或者修改一大片数据的时候,而且这些数据是连续存放的话,那么这些数据就会有起点和终点。我们拷贝数据的话就会涉及到原数据和目标数据,所以这里有SI是源变址寄存器,DI就是目的变址寄存器。在串操作类指令的时候,SI和DI具有特别的功能。
指针寄存器
指针寄存器用来寻址内存中堆栈内的数据。这里大家一定要注意1个概念,中国的语言博大精深,比如在小说中说1个人爱佩刀剑,其实这里只是指的剑,没有刀,这里的堆栈呢!也一样,堆栈就是值栈,并没有堆,堆是堆,栈是栈。
栈是主存中一个特殊的区域,栈是一个先进后出的概念,比如坐电梯先进去的最后出来,子弹夹,也是先放入的子弹,后面才打出来。
栈通常由寄存器自动维持,在8086中,由堆栈段寄存器SS和堆栈指针寄存器SP共同指示。为什么要共同指示呢!这个还是由于寻址方式有关系。
这是一种结构,先只要记住就好!
*SP不能再用于其他目的,具有专用目的,但是技术这个东西不能把它说死,修改也是可以的,但是修改以后程序如何跑下去就很难说了。
*BP为基址指针寄存器,表示数据在堆栈段中的基地址,基地址是这样的,比如,我们现在去找公共厕所,我们在路上问1个人,他说,你看见前面的红灯吗,红灯处往左100米就有个公共厕所、那么这时候红灯就是一个基地址。
*SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址。
指令指针IP
我们的指令是一条一条的执行,所以我得有个记录,目前执行到了哪里,所以我们必须要有指令指针IP以确定指令执行到什么地方啦!我们学C语言的时候就知道存储器有一个唯一编号,既然存储器中有可以放数据又可以放代码,比如我们现在执行到了10000行代码,下一条指令是3字节,那么这时候IP会被修改为10003.IP永远指向下一条指令的地址。IP也是一个专用寄存器,同理,技术不是绝对的,你想放也可以放,有些特种需要可以放一下,当然这必须在你谋划好了的情况下,这样一切都还你的控制之下,如果不是你的控制之下,一下子把IP搞混淆了,指向了数据段去,结果数据段又没代码。这个时候就指令走飞啦!
标志寄存器
用于反应指令执行结果或控制指令执行形式,8086处理器的各种标志形成了一个16位的标志寄存器FLAGS。
比如做加法,溢出或者进位的时候,标志寄存器就可以表示出来。
标志寄存器有以下分类:
*状态标志--用来记录程序运行结果的状态信息,许多指令的执行都将相应的设置它
CF ZF SF PF OF AF
CF进位标志:当运算结果的最高有效位有进位或者借位时,进位标志置1,即CF=1 否者CF=0。
ZF零标志ZF:若运算结果为0,则ZF=1 否则ZF=0;
SF符号标志:这个是针对有符号的数,运算结果最高位为1,则SF=1.否则SF=0;
PF奇偶标志;OF溢出标志:主要是对有符号而定,若算术运算的结果有溢出,则OF=1,否则OF=0;