30天自制操作系统-第3天

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语言代码:

        声明汇编语言写成的函数,不需要加_

 

最近又要赶论文。。先鸽一个月了。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值