第一章 自己动手写第一个最小的“操作系统”

来源:互联网 发布:重庆时时彩平台源码 编辑:程序博客网 时间:2024/04/29 03:54

1. 工具准备

     1. 硬件

  • 一台计算机(Win7/Win8操作系统)
  • 一个U盘

     2. 软件

  • 编辑器Notepad++
  • 汇编编译器NASM
  • WinHex 16进制编辑器

2. 引导扇区代码(汇编)

;--------------------------------------boot.asm------------------------------;    ORG 7C00H; 告诉编译器程序加载到7c00处MOV AX,CSMOV DS,AXMOV ES,AXCALL DispStr; 调用显示字符串例程JMP $        DispStr:MOV AX,BootMessageMOV BP,AX; ES:BP = 串地址MOV CX,16; CX = 串长度MOV AX,01301H; AH = 13,  AL = 01HMOV BX,000CH; 页号为0(BH = 0) 黑底红字(BL = 0CH,高亮)MOV DL,0INT 10H; 10H 号中断RET    BootMessage:DB "Hello, OS World!"TIMES510-($-$$) DB 0; 填充剩下的空间,使生成的二进制代码恰好为512字节DW0xAA55; 结束标志

3. 操作步骤 

     1.用NASM编译

   nasm boot.asm -o boot.bin

     2. 用WinHex刻录

  • 打开boot.bin文
    “菜单栏”------>“文件”------>“打开”------>“boot.bin”
  • 打开U盘
    “菜单栏”------>“工具”------>“打开磁盘”------>“逻辑驱动:移动存储介质”------>“确定”
  • 把boot.bin文件的数据复制到U盘的引导扇区
    1)CTRL+A全选boot.bin文件数据,CTRL+C复制boot.bin文件的数据
    2)左键单击U盘偏移地址为0的地方(即第0行第0列)
    3)“右键单击”------>“编辑”------>“剪贴板数据”------>“写入”------>“确定”
    4)“菜单栏”------>“文件”------>“保存扇区”------->“确定”------>“是”
  • 重启电脑,按下F10键打开BOIS菜单,选择从U盘启动,可以看到屏幕显示红色的字符串“Hello,OS World!”

4. 原理解释

     1. ORG 7C00H

有的书上说ORG的作用是规定某一段内存程序代码或数据存放的起始偏移地址。但其实ORG 指令本身并不能决定程序将要加载到内存的什么位置,它只是告诉编译器,我的程序在编译好后需要加载到 XXX地址,所以请你在编译时帮我调整好数据访问时的地址。ORG是伪指令,只会在编译期影响到内存寻址指令的编译(编译器会把所有程序用到的段内偏移地址自动加上ORG后跟的数值),而其自身并不会被编译成机器码。
如果一个程序使用了ORG XXX 指令,那么该程序只能被加载到段内偏移 XXX 处,否则将不能正常访问段内数据。

     2. INT 10H 

INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序。调用前需要在寄存器AH中存放欲调用的功能号。

     3. DW    0xAA55

如果磁盘的第一个扇区以0xAA55结束,那么BOIS认为它是一个引导扇区。

详细说明请参考INT 10H中断功能详解。

     4. 单美元符号$和双美元符号$$

$表示当前行被汇编后的地址,$$表示一个节的开始处被汇编后的地址,$-$$表示本行距程序开始处的距离。

5.注意事项

  • 只有完整版的WinHex才能刻录U盘
  • 在NASM中,任何不被方括号[] 括起来的标签或变量名都被认为是地址,访问标签中的内容必须使用[]。Offset这个关键字在NASM中是不需要的,因为不加方括号 [] 时表示的就是Offset。

6.遗留的问题

  • 汇编语言中定位伪指令ORG的作用机理是什么?
  • 操作系统把可执行程序装入内存执行的过程是什么?
  • 操作系统怎么把可执行程序装载到指定的位置呢?











原创粉丝点击