启动您自己的“Hello World”应用程序






3.91/5 (11投票s)
在这里,我将展示一个简单的“Hello World”应用程序,你可以像操作系统一样从软盘启动它。
引言
简单来说,这是一个只显示简单消息“Hello World”的操作系统。源代码是用汇编语言(NASM)编写的,可以从软盘启动。
背景
读者必须熟悉所有的操作系统术语和引导加载机制,以及对 16 位汇编语言的最小了解,并熟练使用 NASM(可免费下载)和 MSDOS 程序 Debug.Exe。
Using the Code
在不作任何描述的情况下,让我编写引导加载程序代码。
;**************************************************
; Hello World OS Boot loader
; Designed by Arnav
; http://pendorasoft.byethost15.com/
;**************************************************
[BITS 16]
[ORG 0x0000]
; code located at 0000:7C00, adjust segment registers
cli
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; create stack
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti
; post message
mov si,msgHello
call DisplayMessage
mov si, msgEnd
call DisplayMessage
hlt
; Display Message
DisplayMessage:
lodsb ; load next character
or al, al ; test for NUL character
jz .DONE
mov ah, 0x0E ; BIOS teletype
mov bh, 0x00 ; display page 0
mov bl, 0x07 ; text attribute
int 0x10 ; invoke BIOS
jmp DisplayMessage
.DONE:
ret
; data section
msgHello db 0x0D, 0x0A, "Hello World", 0x0D, 0x0A, 0x00
msgEnd db 0x0D, 0x0A, "That's all folks!!!", 0x0D, 0x0A, 0x00
;ASM Signature
TIMES 510-($-$$) DB 0
DW 0xAA55
将上面的代码保存到一个文件中,例如 boot.asm。
接下来,我们需要为上面的代码生成一个 RAW 二进制代码文件。所以我使用了 NASM。假设 NASM 在系统路径中,我们在命令提示符下输入以下内容
D:\>NASM boot.asm -o boot.bin -f bin
接下来,我们需要一个软盘来启动操作系统。所以将软盘放入 A 盘,在继续之前,请备份软盘上的任何数据,因为我们需要在此步骤中格式化软盘
D:\>format a: /q
我进行了快速格式化以节省大量时间,但完全格式化也可以。
现在我们需要将我们的操作系统二进制文件复制到软盘上。所以我们使用 Debug.Exe 程序如下
D:\>debug boot.bin
-W 100 0 0 1
-Q
D:\>
在 debug 程序中输入 -W
选项后,二进制文件将被 RAW 写入软盘的引导扇区,之后我们退出 debug 应用程序。
所以我们的操作系统完成了。现在重启系统并从软盘启动。我们将在屏幕上看到以下输出
Hello World
That's all folks!!!
然后计算机停止,因为它现在接收到 HLT
指令。
关注点
需要注意的是,这并不是一个真正的操作系统,而是一个内核引导加载程序。因此,我在这里可以执行的活动受到限制,为 512 kb(1 个扇区)。所以我的代码大小不超过 512 kb,其中包括数据段。
除此之外,我认为代码本身不言自明。唯一需要注意的棘手部分是,加载器总是尝试在引导加载程序中搜索签名 0xAA55
,以将其标记为有效加载程序。因此,在我的代码(和数据)空间的 510 字节的末尾,提供了额外的 2 个字节用于 2 个字节的签名,以便加载器验证我的代码是否有效。
问题
这个操作系统的问题是,在操作系统复制到软盘后,Windows 或 MSDOS 会认为软盘未格式化,然后每次我尝试更新上面的代码时,我首先必须格式化软盘,然后复制引导扇区二进制文件(boot.bin)。
我欢迎任何修改上述代码的建议,以便格式化的数据不会被破坏。
历史
- 2008 年 7 月 23 日:初始发布