CF:进位标志,1位寄存器
JC:若进位标志是1,则跳转
INT 0x13:
调用磁盘BIOS
AH = 0x00(系统复位)/ 0x02(读盘)/ 0x03(写盘)/ 0x04(校验)/ 0x0c(寻道)
AL = 处理对象的扇区数
CH = 柱面号 & 0xff
CL = 扇区号(0-5位)| (柱面号 & 0x300)>> 2
DH = 磁头号
DL = 驱动器号
ES:BX = 缓冲地址,读取到内存的哪里,实际值为ES * 16 + BX,相当于16进制的ES只左移了1位,但要加上4位的BX,最大能表达10FFEF,而不是FFFFF
返回值:FLAGS.CF=0:没有错误,同时AH=0
FLAGS.CF=1:有错误,同时错误代码存入AH
内存的0x8000~0x81ff:512个字节留给启动区,要将启动区的内容读到这里
内存的0x8200~0x83ff:存放磁盘其余内容
指定内存地址时,会默认省略段寄存器DS,为避免错误写入,要先将DS设为0
复制磁盘的一个扇区内容到内存
ES = 0x820
CH = 0
DH = 0
CL = 2
AH = 0x02
AL = 1
BX = 0
DL = 0x00
INT 0x13
JC error
JNC:若进位标志等于0,则跳转
JAE:若大于等于,则跳转
为避免读取软盘出错,读一个扇区时要多读几次
初始化参数和原来一样
SI = 0
retry:
读取磁盘
JNC fin
SI += 1;比较SI和5:JAE error
重置驱动器:AH = 0x00;DL = 0x00;INT 0x13;
JMP retry
JBE:小于等于时跳转
读取18个扇区
初始化参数和原来一样
readloop:
SI = 0
retry:
读取磁盘和原来一样
读取磁盘后,JNC next
出错的话和原来一样
next:
ES += 0x200 内存装载地址向后移动512个字节
CL += 1;比较CL和18:JBE readloop
JB:小于时跳转
CYLS EQU 10:声明一个常数,CYLS = 10
0x08200~0x34fff:用来存储磁盘除启动区的10个柱面内容
读取10个柱面
前面和原来相同
next:
ES += 0x200
CL += 1;比较CL和18:JBE readloop
CL = 1
DH += 1;比较DH和2;JB readloop
DH = 0
CH += 1;比较CH和10:JB readloop
制作包含启动区和操作系统的完整镜像文件
编写操作系统代码.nas文件
使用nask,将.nas文件编译为二进制文件,生成.sys文件
使用edimg,使用启动区二进制文件制作镜像文件,并将操作系统二进制文件复制进该镜像文件,生成.img文件
镜像文件的0x002600附近保存了操作系统文件的名称
镜像文件的0x004200附近保存了操作系统文件的具体内容
磁盘内容被装载到内存的0x8000开始的位置,因此操作系统的内容从内存的0xc200位置开始
操作系统完成执行流程
启动区代码最后加上 JMP 0xc200
操作系统代码开头加上 ORG 0xc200
INT 0x10:
切换显示模式
AH = 0x00
AL = 0x03(16色字符模式,80x25)/ 0x12(VGA图形模式,640x480x4位彩色模式,4面存储模式)/ 0x13(VGA模式,320x200x8位彩色模式,调色板模式)/ 0x6a(扩展VGA图形模式,800x600x4位彩色模式,4面存储模式)
返回值:无
设置完成后,0x000a000~0xaffff就成为了显存地址,修改这一段内存的值会改变屏幕的像素
系统切换到32位模式之后,就再也不能调用BIOS函数了,因此需要BIOS完成的工作要放在切换模式之前
INT 0x16:
获取键盘指示灯状态
AH = 0x02
INT 0x16
设置完成后,AL的值即为指示灯状态
使用c语言编写操作系统:
在操作系统的汇编语言文件中添加了很多内容,但需要以后再讲解
c语言变为二进制文件:
使用cc1(C语言编译器),从c语言文件生成.gas文件(gas汇编语言的源程序,和nask汇编语言不兼容)
使用gas2nash,从.gas生成.nas(将gas汇编语言的代码转换为nask汇编语言的代码)
使用nask,从.nas生成.obj(由C语言生成的一种特殊的机器语言文件,可以与其他.obj文件链接起来实现对C语言功能上的补充)
使用obj2bim,从.obj生成.bim(二进制映像文件,为了做成完整的机器语言文件,将必要的目标文件全部链接上)
使用bim2hrb,从.bim生成.hrb(为了使生成的机器语言能实际使用,还需要根据操作系统要求添加文件头、压缩等,.hrb是作者自己写的一种文件格式)
制作操作系统文件:
使用nask,将操作系统的汇编语言.nask部分的文件编译而二进制文件.bin
将c语言变为二进制文件.hrb
使用windows的复制指令,将汇编的二进制文件.bin和c语言的二进制文件.hrb简单拼接起来,生成.sys文件
RET:返回指令,调用该函数前会自动保存正在执行的位置,函数运行完后调用RET,会自动找到调用本函数之前指定到的位置,然后继续执行
c语言调用汇编语言:
编写汇编语言代码:
使用WCOFF目标文件模式
使用32位模式
声明源文件名
声明本文件包含的函数名
[SECTION .text]
_函数名:
...
RET
c语言代码:
声明汇编语言写成的函数,不需要加_
最近又要赶论文。。先鸽一个月了。。