(今天主要是将ipl和操作系统haribote分开,并加入了C语言写一部分操作系统,并且在haribot中调用了显卡BIOS显示了窗口)
一、汇编知识
ipl.nas文件是最初的磁盘映像文件;haribote.nas中存放的是操作系统(haribote.nas先用nask编译成.sys文件,后再将这个文件保存到磁盘映像.img里面,.sys文件的文件名在0x2600处,内容在0x4200处)。
再这一章节中,作者先向ipl.nas中加入了调用磁盘BIOS、读盘、读盘试错的指令;后向操作系统中加入了fin、调用显卡BIOS显示黑;并在最后导入了c语言。
ipl.nas完成初始化寄存器,并调用BIOS输出文字“hello,world",之后读取磁盘中的内容到内存中。磁盘内容包括程序,haribote.nas文件内容前后两部分拆分成asmhead.nas、bootpack.c。asmhead.nas实现大部分的设置,bootpack.c暂时只用来hlt,但是c语言没有hlt,需要naskfunc.nas文件来补充_io_hlt:的功能。
启动过程推理:开机,BIOS读取磁盘启动区的启动程序到内存中,启动程序读取磁盘剩余程序到内存,内存中执行该程序调用执行其他功。
1.调用磁盘BIOS读取磁盘内容
;读磁盘
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
MOV AH,0x02 ; AH=0x02——读盘;0x04——校验;0x0c——寻道
MOV AL,1 ; 1个扇区 AL=处理对象的扇区数
MOV BX,0 ; ES:BX=缓冲地址
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
返回值:FLACS.CF=0 表示没有错误,AH=0
FLACS.CF=1 表示错误,错误号码存入AH
JC error ; 进位标志是1就跳转
磁盘与光盘不同,两面都能记录。磁盘有80柱面,2磁头,18扇区,每个扇区512字节,共计1440KB。
缓冲区地址:要把磁盘上读取的数据装载到内存中的哪个位置。
内存分布:0号地址放BIOS的常用函数;0x7c00~0x7dff启动区内容的装载地址;0xf0000放BIOS本身;0x8000~0x81ff留给启动区;作者将启动程序装在地址在0x7c00(启动区程序,即ipl.nas文件中的程序);缓冲区地址分配到0x8200(从软盘C0-H0-C1读取的数据)。那么.img文件装载在磁盘哪里?0x7c00和0x8000处有何不同?0x8000可能并没有装载启动区程序,从0x8200才开始装载磁盘第二个扇区的内容。
补充:JNC-进位标志为0跳转;JAE-大 于等于跳转;JBE-小于等于跳转;
设置显卡模式
; haribote-os
; TAB=4
ORG 0xc200 ; 程序装载到内存中的地址
MOV AL,0x13 ; VGA显卡,320x200x8bit彩色
MOV AH,0x00
INT 0x10
fin:
HLT
JMP fin
文中总结:文件编译后的二级制文件中,文件名在0x2600处,文件内容在0x4200处。因为磁盘缓存区内容加载到内存的0x8000处,所以文件内容被加载到内存中0x4200+0x8000=0xc200处。