30天自制操作系统
01_days
CPU其实只算是个集成电路板,它只能忠实地执行电信号给它的指令,输出相应的电信号。也就是说,其实CPU只是个乖乖执行命令的笨蛋。
人们发现把二进制的01与电信号的开关对应起来,CPU就从一个处理电信号的机器摇身一变为一个神奇的二进制数计算机。给文字进行编码,就把文字也转换成二进制了,从而让CPU实现对文章的处理等等。
汇编语言:
DB define byte, 往文件中直接写入1个字节的指令
DW define word 定义字 16位,也就是两个字节
DD define double word 定义32位
DB可以直接用来写字符串,在写字符串时,汇编语言会自动地查找字符串中每一个字符所对应的编码,然后把它们一个字节一个字节地排列起来。
DB "HELLOIPL"
$是一个变量,表示现在这一样的字节数。主打一个灵活性
启动区:软盘的第一个扇区称为启动区,如果计算机确认了第一个扇区的最后两个字节正好是55AA,就认为这个扇区的开头是启动程序,并开始执行这个程序
IPL:initial program loader

02_days
MOV:赋值
MOV AX, 0 ;AX=0
MOV SS, AX ;SS=AX
AX accumulator, 累加寄存器
CX counter,计数寄存器
DX data,数据寄存器
BX base,基址寄存器
SP stack pointer
BP base pointer
SI source index
DI destination index
这些寄存器都是16位寄存器,可以存储16位的二进制数。X表示拓展extend的意思,也就是说之前的CPU寄存器都是8位的,现在变成了16位,扩展了一倍,所以加了个X,表示自己很了不起。这8个寄存器合起来也 一共才区区16个字节。
另外,CPU还有八个八位寄存器,注意不是新寄存器,而是从上面八个寄存器中拆出来命名的。
AL 累加寄存器低位
CL 计数寄存器低位
DL 数据寄存器低位
BL 基址寄存器低位
AH 累加寄存器高位
CH 计数寄存器高位
DH 数据寄存器高位
BH 基址寄存器高位

有人可能会说,嘿,我的电脑是32位的,这样就能以32位为单位来处理数据了吧,那32位的寄存器在哪?
EAX, ECX, EDX, EBX, ESP, EBP,ESI, EDI
通过对寄存器的了解,我们知道CPU的存储能力很差,如果想要让CPU处理大量信息,就必须给它另外准备一套用于存储的电路。也就是内存。内存并不在CPU的内部,而是在CPU的外部。实际上CPU与内存之间的数据交换并不只是为了存取数据。因为从根本上讲,程序本身也是保存在内存中的,程序一般都大于44字节,不可能保存在寄存器中。CPU在执行机器语言时,必须从内存中一个命令一个命令地读取程序,顺序执行。
在汇编语言中,我们使用[方括号]来表示内存地址
MOV BYTE [678], 123
用内存的“678”号地址来保存123这个数值。虽然这里的指令里面有数字,但实际上内存和CPU一样,根本没有什么数值的概念,所谓的“678”就是一大串开与关的电信号而已。当内存收到这一串信号时,电路中的某8个存储单元就会响应,这8个存储单元会记住代表“123”的开(ON)或关(OFF)的电信号。为什么是8位呢?这是因为指令里指定了“BYTE”。
同理 MOV WORD [678], 123 内存地址中的678号和旁边的679号都会做出反应,一共是16位。这时,123被解释成一个16位的数值,也就是0000000001111011,低位的01111011保存在678号,高位的00000000保存在旁边的679号
至于内存地址的指定方法,我们不仅可以使用常数,还可以用寄存器。比如“BYTE [SI]”、“WORD [BX]”【第一个字符表示存储的长度大小】
虽然我们可以用寄存器来指定内存地址,但可作此用途的寄存器非常有限,只有BX、BP、SI、DI这几个。剩下的AX、CX、DX、SP不能用来指定内存地址,这是因为CPU没有处理这种指令的电路。

BIOS是“basic input output system"基本输入输出程序。它是为操作系统开发人员准备的各种函数的结合,而INT就是用来调用这些函数的指令,INT后面是数字,使用不同的数字就可以调用不同的函数。



浙公网安备 33010602011771号