最近好多天没有更新笔记了,主要是最近几个月在写操作系统,比较忙点了,大约要写3个月左右呢,因为我学习的安排也会顺着兴趣随时做一些小的改动,因为兴趣是最好的老师嘛!今天在写操作系统之余再更新汇编的学习笔记。其实写操作系统也是对汇编,C语言,数据结构与算法的综合学习,很有趣味又能回顾知识点,还能熟悉操作系统原理,真是太好了!现在的笔记我会多写操作的描述,动手去练习然后发现问题比只是看书效率真的高很多哦!
DEBUG的“R”命令
当我们在CMD中键入 debug后,会进入debug系统,我们来看看debug中的一个命令'r'.当我们键入r后,会出现下面的画面:
是不是又发晕了,哈哈!要是又发晕,肯定是之前几节笔记没有仔细看呀!其实看起来蛮复杂,其实就只有14个寄存器!嗯?!不对呀!仔细一数没有14个啊!只有13个的啊,你说对了,比较明显的就13个,不过后面那排NV UP EI PL NZ NA PO NC是什么呀!其他它们是第14个寄存器中的8位!其实这14个寄存器都是16位的,那为什么这里只显示出其中的8位呀?!因为这个寄存器我们只用到了其中的9位,而且其中还有一位是单步调试中断使用,所以这里就只有8位了哦。每个寄存器都是16位的,大家能看出来吗?像图中的DS是1415,这个是16位知道的吗,要是不知道就去看我写的C语言学习笔记里面有写哦!一下子来了这么多的寄存器,我怎么知道里面谁是干什么用的呀!或者里面谁和谁又有什么关系啊?!其实寄存器就像这个社会中的不同的人,每个人有不通的工作方向和技术方向,所以每个寄存器也有它们各自的职能,社会中有些人是情侣,他们之间的关系比较亲密,其实寄存器中也有这样的关系的呢!具体怎么个关系和各自的特点,慢慢的说了哦!
其实大家发现1个问题没有,我们去网上下载操作系统的时候,一般不是32位的就是64的位,怎么这里的寄存器是16位的呢!我一直也为这个问题苦恼了小会.其实我们这里看到的寄存器是操作系统虚拟出来的,其实我们真正的电脑不是这样的结构的,哦!原来是这样,我就说呢,怎么有本书叫WINDOWS32位汇编语言程序设计。所以我们现在弄的这个是8086,16位汇编,32位以后再学了呢!最早的电脑是4位的,后来又是8位的,再后来出现了16位,由于在16位机器去上有好多特好的程序,随着硬件的发展,如果要兼容16位机的程序就必须制造16倍数的机器,所以后来就32位,64位了。但是在早起,硬件的成本很昂贵,为了达到高性价比的特点,就只用了20位地址线,这样的话,内存的寻找能力就是1M。但是我们的电脑并不处理20位数据呀!而且早在8位机的时候,一次还只能处理8位的数据,我先来看看,16位机器是如何处理8位数据的,我们看到寄存器是16位的,比如AX,BX,CX,DX如果把它们的1个16位的一分为二不就可以了吗,其实真实的情况就是这么处理的,AX分成AL,AH,其他同理。我们来实践实践加深理解。
T命令是单步执行的意思哦!大家看了吧!一起都在我们的掌握之中,不过有个地方很奇怪呀!IP怎么也在变,我们写的代码没有更改IP的值呀!其实通过细心的观察就知道了.比如1415:0100 后面的是IP的值,那么前面的1415是什么呢,仔细一看,1415和DS,ES,SS,CS的值一样,那么到底是其中的哪个的呢!其实是CS的。呵呵!为什么这样的,虽然,DS,ES,SS,CS的值都是1415,但是IP只喜欢CS,呵呵!所以它们是一对的。这样的话CS:IP就指向当前运行的代码。
我们再来看看刚才哪个问题,16位电脑中如何去用20位的地址线的。我们来看看刚才CS:IP的值:1415:0100。如果要16位变20位,只要左移4位不就可以了吗,关于位移如果不清楚的就去看我学C时候的笔记吧!所以为了解决这个问题就引入了段的概念。冒号前面的就叫做段地址,冒号后面的就叫做段内偏移地址。左移4位就是X16,所以真实的地址就是段地址X16+段内偏移地址。很简单吧!只是有点繁琐,但是没办法呀!为了兼容,只有这么办啦!所以电脑必须要提高段寄存器呀!所以DS ES SS CS就是4个段寄存器,我们现在知道了CS,代码段,那么其他是什么段呢,以前我学C时候的笔记不是分析了1个程序还有其他段的吗,那么其他3个具体表示什么呢,等以后的笔记再说了,这样一来是不是觉得汇编也什么难的呀!说到段,还要注意1个问题,就是不能对段进行直接赋值,如果我们写MOV DS,4444 会出错,为什么会这样呢?!其实这个没有为什么,造CPU的人就是这么造的,记住就好了啦!你可以用1个通用寄存器进行间接赋值就好了。不过有个奇怪的地方,我们如果用这种方法去修改CS的值为什么会跳出1个对话框,然后退出程序呢!那么怎么样才能修改CS的值呢?!这确实1个问题,这个问题下次笔记再说了。
我们再来看1个有趣又疑惑的问题。我们知道D命令是显示一段内存地址的值,那么我们来用D命令看1段内存,就看,03A3:006E吧!
我们再来看1段地址的值,我们就看03a0:009e
发现问题了没有,!怎么一模一样的,我们仔细一敲,也很正常啊!03A9E=03A30+006E ,03A9E=03A00+009E 。是吧!因为这个段是认为规定的,同样1个地址,你可以用很多种方式去寻址呢!
这节就到这里了,仔细算算,今天学到了不少东西呢,一起征服汇编吧!通过以前学习C语言,我觉得对汇编的理解也有好大的帮助的呢!你说是吗?!因为对于16进制我们早就熟悉了,对于内存,我们也好熟悉好熟悉了呢!发现没有!汇编和HTML很像,不知道你们是不是这样觉得的!