65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.91/5 (11投票s)

2008年7月23日

CPOL

2分钟阅读

viewsIcon

44671

在这里,我将展示一个简单的“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 日:初始发布
© . All rights reserved.