《30天自制操作系统》——从汇编到C

本文介绍了如何从汇编语言编写引导扇区,再到使用C语言编写操作系统的核心部分。通过ipl.nas、asmhead.nas、func.nas和bootpack.c四个文件,逐步构建操作系统。ipl.nas负责加载数据,asmhead.nas切换到保护模式,bootpack.c改变屏幕颜色,func.nas提供辅助函数。文章详细阐述了每个阶段的代码实现和转换过程,最终通过编译和链接生成可运行的二进制文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次我们要用到4个文件,分别是ipl.nas、asmhead.nas、func.nas和 bootpack.c。
ipl.nas是引导扇区中的16bit程序,用于从磁盘中加载数据并跳转到asmhead.nas中。
asmhead.nas也是16bit程序,用于加载全局变量表,切换cpu到32位的保护模式,并跳转到后面的程序。
bootpack.c用于改变屏幕颜色,func.nas为bootpack.c提供相应的一些函数。
那么我们现在就开始吧。

ipl.nas和上一篇文章中的程序几乎没有什么变化,我去掉了打印hello world的部分,同时在其中多加了一句MOV    [0x0ff0],CH来记录读了多少个柱面。

程序一、ipl.nas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hello-os
; TAB=8

    ORG    0x7C00

; 标准FAT格式软盘
start:
    JMP    entry
    DB    "HELLOIPL"    ; 启动区名称(8字节)
    DW    512        ; 扇区大小(512字节)
    DB    1        ; 簇大小(1扇区)
    DW    1        ; FAT起始位置 Reserved Sectors
    DB    2        ; FAT个数
    DW    224        ; 根目录(224项) Root Entries
    DW    2880        ; 磁盘大小(2880扇区) 2*80*18 Small Sectors
    DB    0xf0        ; 磁盘种类
    DW    9        ; FAT长度
    DW    18        ; 每个磁道扇区数
    DW    2        ; 磁头数
    DD    0        ; 隐藏扇区
    DD    2880        ; 重写一次磁盘大小 Large Sectors
    DB    0,0,0x29    ; Physical Drive Number, Current Head, Signature
    DD    0xffffffff    ; 可能是卷标号码 ID
    DB    "HELLO-OS   "    ; 磁盘名称(11字节) Volume Label
    DB    "FAT12   "    ; 格式名称(8字节) System ID
    RESB    18        ; 空出18字节
; 进入引导程序
entry:
    MOV    AX,0        ; 初始化寄存器
    MOV    SS,AX
    MOV    SP,0x7c00
    MOV    DS,AX
    MOV    ES,AX
; 读磁盘
    CYLS    EQU    10
    MOV    AX,0x0820
    MOV    ES,AX        ; ES:BX为内存缓存地址 ESx16+BX
    MOV    CH,0        ; 柱面0
    MOV    DH,0        ; 磁头0
    MOV    CL,2        ; 扇区2
readloop:
    MOV    SI,0        ; 记录失败次数

retry:
    MOV    AH,0x02        ; 读盘
    MOV    AL,1        ; 1个扇区
    MOV    BX,0
    MOV    DL,0x00        ; 0驱动器
    INT    0x13        ; 调用磁盘BIOS
    JNC    next        ; 没出错则读下一个扇区
    ADD    SI,1        
    CMP    SI,5        ; 比较SI与5
    JAE    error        ; 超过允许错误次数,跳转到error
    MOV    AH,0x00
    MOV    DL,0x00
    INT    0x13        ; 重置驱动器
    JMP    retry
next:
    MOV    AX,ES
    ADD    AX,0x0020    ; 把内存地址后移0x200
    MOV    ES,AX        ; 因为没有(ADD ES,0x20)
    ADD    CL,1
    CMP    CL,18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值