您的位置:首页 > 其它

汇编指令——《30天自制操作系统》笔记

2015-04-15 00:00 225 查看
DB:DB指令是“data byte”的缩写,也就是往文件里直接写入1字节的指令。

DB:其次是DB指令的新用法。我们居然可以直接用它写字符串。在写字符串的时候,汇编语言会自动地查找字符串中每一个字符所对应的编码,然后把它们一个字节一个字节地排列起来。

RESB:RESB指令是“reserve byte”的缩写,如果想要从现在的地址开始空出10个字节来,就可以写成RESB 10,意思是我们预约了这10个字节(大家可以想象成在对号入座的火车里,预订了10个连号座位的情形)。

;:首先是“;”命令,这是个注释命令,相当于C语言或是C++中的“//”。

DW/DD:再有就是DW指令和DD指令,它们分别是“data word”和“data double-word”的缩写,是DB指令的“堂兄弟”。word的意思是“单词”,但在计算机汇编语言的世界里,word指的是“16位”的意思,也就是2个字节。“double-word”是“32位“的意思,也就是4个字节。

$:对了,差点忘记说RESB 0x1fe-$了。这个美元符号的意思如果不讲,恐怕谁也搞不明白,它是一个变量,可以告诉什么这一行现在的字节数(如果严格来说,有时候它还会有别的意思,关于这一点我们明天再讲)。

ORG:这个指令会告诉nask(作者自己写的汇编语言编译器),在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。如果没有它,有几个指令就不能被正确的翻译和执行。另外,有了这条指令的话,美元符($)的含义也随之变化,它不再是指输出文件的第几个字节,而是代表将要读入的内存地址。ORG指令来源于英文”origin“,意思是”源头、起点“。它会告诉nask,程序要从指定的这个地址开始,也就是要把程序装载到内存中的制定地址。

JMP:下一个是JMP指令,它相当于C语言的goto语句,来源于英文的jump,意思是”跳转“。

entry::再下面是”entry:“,这是标签的声明,用于制定JMP指令的跳转目的地等。

MOV:这个指令的功能非常简单,即赋值。

ADD:ADD是加法指令。若以C语言的形式改写”ADD SI, 1“的话,就是SI = SI + 1。

CMP:CMP是比较指令。或许有人想,比较指令是干什么的呢?简单说来,它是if语句的一部分。譬如C语言会有这种语句:

if(a == 3) { 处理; }

即对a和3进行比较,将其翻译成机器语言时,必须写成“CMP a, 3”,告诉CPU比较的对象,然后下一步写“如果二者相等,需要做什么”。

这里是“CMP AL, 0”,意思就是将AL中的值与0进行比较。这个指令源自英文中的compare,意为”比较“。

JE:JE是条件跳转指令中之一。所谓条件跳转指令,就是根据比较的结果决定跳转或不跳转。就JE指令而言,如果比较结果相等,则跳转到指定的地址;而如果比较结果不等,则不跳转,继续执行下一条指令。

INT:INT是软件中断指令。如果现在就讲中断机制的话,肯定会让人头昏脑胀的,所以我们暂时先把它看作一个函数调用吧。这个指令源自英文”interrupt“,是”中途打断“的意思。

电脑里有个名为BIOS的程序,出厂时就组装在电脑主板上的ROM单元里。电脑厂家在BIOS中预先写入了操作系统开发人员经常会用到的一些程序,非常方便。BIOS是英文” basic input output system“的缩写,直译过来就是”基本输入输出系统(程序)”。

最近的BIOS功能非常多,甚至包括了电脑的设定画面,不过它的本质正如其名,就是为操作系统开发人员准备的各种函数的集合。而INT就是用来调用这些函数的指令。INT的后面是个数字,使用不同的数字可以调用不同的函数。这次我们调用的是0x10(即16)号函数,它的功能是控制显卡。

HLT:HLT是让CPU停止动作的指令,不过并不是彻底地停止(如果要彻底停止CPU的动作,只能切断电源),而是让CPU进入待机状态。只要外部发生变化,比如按下键盘,或是移动鼠标,CPU就会醒过来,继续执行程序。说到这,请大家再仔细看看这个程序,我们会发现其实不管有没有HLT指令,JMP fin都是无限循环,不写HLT指令也可以。

然而笔者讨厌让CPU毫无意义地空转。如果没有HLT指令,CPU就会不停地全力去执行JMP指令,这会使CPU的负荷达到100%,非常费电。这多浪费呀。我们仅仅加上一个HLT指令,就能让CPU基本处于睡眠状态,可以省很多电。什么都不干,还要耗费那么多电,这就是浪费。即便是初学者,最好也要一开始就养成待机时使用HLT指令的习惯。或者说,恰恰应该在初学阶段,就养成这样的好习惯。这样既节能环保,又节约电费,或许还能延长电脑的使用寿命呢。

对了,HLT指令源自英文“halt”,意思是“停止”。

JC:所谓JC,是“jump if carry”的缩写,意思是如果进位标志(carry flag)是1的话,就跳转。

JNC:JNC是另一个条件跳转指令,是“Jump if not carray”的缩写。也就是说进位标志是0的话就跳转。

JAE:JAE也是条件跳转,是“Jump if above or equal”的缩写,意思是大于或等于时跳转。

JBE:这也是一个条件跳转指令,是“jump if below or equal”的缩写,意思是小于等于则跳转。

JB:这也是条件跳转指令,是“jump if below”的缩写。翻译过来就是:”如果小于的话,就跳转。“

EQU:这相当于C语言的#define命令,用来声明常数。”CYLS EQU 10“意思是”CYLS = 10“。EQU是”equal“的缩写。

说明:

1、重新读盘之前,我们做了以下的处理,AH=0x00,DL=0x00,INT 0x13。通过前面介绍的(AT)BIOS的网页我们知道,这是“系统复位”。它的功能是复位软盘状态,再读一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: