day02

By | 2016-07-03

第二天教学完成后,最终生成的软盘映像文件较之第一天并没有变化(准确来说,反而比第一天少了)。这一天主要是对代码的简化,使之具有更简单易懂的形式。并删除了可有可无的批处理文件,用Makefile去代替。

去除多余部分,仅保留512字节的启动区(剩下的部分用磁盘映像管理工具来做)

大部分是我们所熟知的汇编命令。这里着墨介绍几个有意思的指令。

  • ORG指令

这个指令告诉编译器(具体到本实例,为nask),在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。也正是因为这条指令的存在,美元符号($)不再指输出文件的第几个字节,而是代表将要读入的内存地址。再回看上面代码中ORG指令后面跟着的是0x7c00这个数字,因为启动区内容的装载地址是从0x7c00这个地址开始的(当初的规定),所以这是必须的写法。


看了本书才体会到,通用寄存器也是各有擅长的职能的。例如用AX(accumulator,累加寄存器),CS(counter,计数寄存器)进行同样的计算。

  • ADD CX, 0x1234; 编译成81 C1 34 12,是一个4字节的命令。
  • ADD AX, 0x1234; 编译成05 34 12,是一个3字节的命令。

可以看出如果都用AX来进行运算的话,程序就可以写的很简洁(指“用机器语言写程序”的情况)。这些差异从汇编语言的源代码上是看不出来的。所以体会到,如果不懂些机器语言的知识的话,对于内部实现上的很多地方还是会难以理解的。


  • HLT指令

HLT是让CPU停止动作(进入待机状态,等待外部发生变化:按下键盘、移动鼠标等)的指令。如果没有这条指令,CPU就会不停地全力执行JMP这条指令,这便使得CPU一直在工作,负荷达到100%。这样不但费电,而且也影响到电脑的使用寿命。

这是一个好的习惯与态度。不单为了实现某一功能,而应同时考虑代价。

除了以上代码方面的简化,作者在这里也对批处理文件经行了整理,用makefile来替代。

用作者的话说,Makefile就像是一个非常聪明的批处理文件。

文件生成规则部分:

这里的意思就是,如果想制作文件ipl.bin,就先检查ipl.nas和Makefile这两个文件是否已经准备好。如果准备好,便执行

这一行。

Makefile比较“智能”的一点就是如果生成文件的依赖文件不存在,它会在Makefile文件里面查找相应依赖文件的生成方法。同时,它在文件的生成更新方面也是很聪明的。

命令部分:

使用这种方法可以达到批处理文件一样的效果。更重要的一点就是可以减少不必要的批处理文件,使得整体看起来更加的轻松舒服,且更加的高效。

执行效果与第一天无异,这里就不累赘展示出来了。

ps:越来越觉得这本书有意思了。

发表评论

电子邮件地址不会被公开。