先弄个HelloWorld吧,虽然这个网上一大堆,不过不知道的人还是不少,就简单的弄一个吧。。。。。。。
系统启动时,第一步是BIOS自检(这个不管),然后从CMOS中设置的默认引导介质中加载第一个扇区(512字节)到内存的0x07C00处(0x0000:0x7C00),
之后,跳转执行。
所以,引导启动系统的第一部分就是对这512字节进行编程。。。
这次呢,就写一个简单的HelloWorld(启动后,在屏幕显示HelloWorld)。
其它功能不考虑,
下面我就开始整了,思想有写乱,你们讲究的看吧。
显示服务(Video Service——INT 10H)
13H号功能
入口:
AH = 13H
AL = 输出方式(用1号,具体为什么自己百度去)
BH = 页码(咱用0号的)
BL = 字符属性
CX = 字符串长度
DH,DL = (x, y) 坐标
ES:BP = 字符串地址
OK
开始吧
# bootasm.S 这里,扩展名必须大写,具体为什么,问GCC去 .globl start start: # 入口地址 .code16 # 声明是16位代码(为什么启动时要用16位代码。。。。自己百度去,,,) # 初始化各个段寄存器 movw %cs, %ax movw %ax, %ds movw %ax, %es movw %ax, %ss
# 设置栈顶 movw $0x7C00, %sp # 清一下屏幕吧。。。。 movw $0x02, %ax int $0x10 # 显示Hello World !!! movw $putstr, %bp movb $0x13, %ah movb $0x01, %al movb $0x00, %bh movb $0x0F, %bl movw $14, %cx # 14个字符 xorw %dx, %dx # 显示坐标为(0, 0) int $0x10 # 死循环,停机 1: hlt jmp 1b putstr: .ascii "Hello World!!!" .byte 0 # 后面要多空开一行,不然编译不通过 编译命令为: gcc -fno-builtin -O2 -MD -nostdinc -I. -c bootasm.S然后链接:
ld -N -e start -Ttext 0x7C00 -o boot.o bootasm.o
最后把链接出来的boot.o转换为bin文件
objcopy -S -O binary -j .text boot.o boot
然后需要将boot扩展到512字节,
最后两个字节设置为
0x55, 0xAA
这是引导标志。
到这里,代码就编译完毕了。
用dd命令把boot写入硬盘镜像中
dd if=/dev/zero of=os0.00.img count=10000 # 创建一个硬盘镜像文件os0.00.img
dd if=boot of=os0.00.img # 把boot写入镜像开头,就是第一个扇区处
这个是截图:
然后就跑一下,看看效果吧。。。。
今天就到这里吧,。。。。。后面慢慢的往里面加功能
先整个简单的。。。