操作系统学习初步--用GNU汇编创建最简单的OS

操作系统学习初步–用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中断指令,所以用二进制码直接代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值