开发OS三日目:制作真正的IPL以及更多汇编指令
返回主页
继续OS制作之路,看到题目,大家可能会说,又是汇编指令啊。其实不必感到害怕的,我们都是用到新的汇编指令才会添加的。主要目的是为了制作真正的IPL(Initial Programming Loader,即启动程序加载器)。
- 磁盘最初的512字节是启动区
- INT 0x13 ;调用磁盘BIOS
新的指令
JC(jump if carry)
- 如果进位标志carry是1的话就跳转
AH = 0x02; 读盘
进位标志是一个只能有存储信息的寄存器
- 对于段寄存器,不管我们要指定内存的什么地址,都必须同时指定段寄存器。
- 如果省略就把DS:作为默认的段寄存器
- 可以省略默认的段寄存器DS JNC指令(jump if not carry)
- 条件跳转指令,进位标志是0就跳转 JAE指令(jump if above or equal)
- 条件跳转指令,进位标志是0就跳转
INT 0X13 ; 系统复位 JBE指令(jump if below or equal)
- 条件跳转指令,小于等于就跳转 JB指令(jump if below)
- 条件跳转指令,如果小于就跳转 EQO指令
- 相当于C语言的#define,用于声明函数 eg:CYLS EQR 10 ; 相当于CYLS = 10; RET指令
- return 返回
反思:
汇编固然复杂,这样循序渐进的学习,近百条指令也是很好学会的。或许最后所谓的OS没有搞出来,汇编还是可以学好的,嘿嘿。
源代码:
; haribote-ipl
; TAB=4
CYLS EQU 10
ORG 0x7c00
JMP entry
DB 0x90
DB "HARIBOTE"
DW 512
DB 1
DW 1
DW 224
DW 2880
DW 9
DW 18
DW 2
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HARIBOTEOS "
DB "FAT12 "
RESB 18
entry:
MOV AX,0
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV AX,0x0820
MOV ES,AX
MOV CH,0
MOV DH,0
readloop:
MOV SI,0
retry:
MOV AH,0x02
MOV AL,1
MOV BX,0
MOV DL,0x00
INT 0x13
JNC next
ADD SI,1
CMP SI,5
JAE error
MOV AH,0x00
MOV DL,0x00
INT 0x13
JMP retry
next:
MOV AX,ES
ADD AX,0x0020
MOV ES,AX
ADD CL,1
CMP CL,18
JBE readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop
MOV [0x0ff0],CH
JMP 0xc200
error:
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1
CMP AL,0
JE fin
MOV AH,0x0e
MOV BX,15
INT 0x10
JMP putloop
fin:
HLT
JMP fin
msg:
DB 0x0a, 0x0a
DB "load error"
DB 0x0a
DB 0
RESB 0x7dfe-$
DB 0x55, 0xaa