操作系统学习初步–用GNU汇编创建最简单的OS
先贴上一段GNU汇编代码:
.code16
.org 0x7c00 /*设置程序地址为0x7c00*/
movw %cs,%ax
movw %ax,%ds
movw %ax,%es
call DispStr /*调用显示字符串*/
forever:
jmp forever /*loop forever*/
DispStr:
movw $BootMessage,%bp /*ES:BP=字符串地址*/
movw $16,%cx /*字符串长度*/
movw $0x1301,%ax /*AH=0x13,AL=0x01*/
movw $0xC,%bx /*Page=0(BH=0)Black ground and red font(BL=0x0C,highlight)
movb $0,%dl
.word 0x10CD /*int 0x10,interrupt 0x10*/
ret
BootMessage:
.asciz "Hello,OS World!"
Append:
.rept 462 /*填充空间,使生成的二进制文件为512字节*/
.byte 0x90
.endr
.long 0xaa55 /*结束标志*/
创建一个编译BAT,命令如下:
as -o boot.elf boot.as
objcopy -O binary boot.elf boot.bin
得到了一个31.5KB的 BOOT.BIN文件。这个程序为什么会这么大呢?原因在于.org指令,汇编器as会在生成的文件前加上0x7C00个NUL字符。那么我们再创建一个程序,将BOOT.BIN文件中的前0x7C00个字符去除,就得到了想要的512字节的BOOT.BIN文件。然后用*Floppywriter程序生成一个BOOT.IMG软驱文件。在VBOX虚拟机中创建一个DOS系统,软驱选择BOOT.IMG,启动,OK。
*Floppywriter程序从《自己动手写操作系统》的光盘中有的。
*请注意汇编代码里有一个 .word 0x10CD ,因为GNU汇编里不支持int中断指令,所以用二进制码直接代替。