不废话直接干货
我的github url
文章
- 手写hello world
- 手写loader
- 进入保护模式
- 开启分页
- kernel
- 汇编与c互相调用
需要的环境 windows环境
- clion(编辑器,看反汇编寄存器用的)
- bochs(运行汇编用的,可以debug)
- nasm(汇编编译器)
- dd.exe命令(构建镜像)
- ob(调试应用)

等下我会打包一个百度云分享出来 github也又相关的文件
1. 编写汇编文件
hello.asm
;表示当前文件被加载到0x7c00h这个位置
org 0x7c00
;把0移动到ax,初始化ax寄存器
mov ax,0
mov ss,ax
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
call clear_screen
call hello
;原地跳转,死循环 $的意思是当前行
jmp $
;清屏执行流
clear_screen:
mov ax,12h
int 10h
ret
;hello 函数/执行流
hello:
mov ax,helloMsg
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
int 10h
helloMsg : db "hello,os world"
;循环 510-(当前-本块代码块的长度)
;为什么是510,因为最后需要两个字节55aa
;磁盘第一块位置512字节,并且最后是55aa,那就表明这是一个引导 boot
times 510-($-$$) db 0
dw 0xaa55

问题
1. 为什么是0x7c00?
实模式先的内存约定
2. 为什么结尾要是0xaa55
需要一个魔数标识第一个扇间是引导
3. 谁读取了0x7c00的代码
bios默认跳转到0x7c00
2. 编译汇编
nasm hello.asm -o hello.bin
3. 打包镜像
dd if=hello.bin -o hello.img bs=512 count=1
4. bochs运行镜像
bochsdbg -q -f bochsrc
bochsrc文件配置
magic_break: enabled=1
display_library: win32, options="gui_debug"
floppya: image="a.img", status=inserted
romimage: file="D:\software\Bochs-2.8/BIOS-bochs-latest", address=0x00000000, options=none
vgaromimage: file="D:\software\Bochs-2.8/VGABIOS-lgpl-latest"
config_interface: win32config

- 改成 D:\software\Bochs-2.8 自己的bochs的文件夹地址
- a.img 换成hello.img
- bochsrc可以在bochs的linuxdemo里面找到,需要改一些配置
- config_interface改成 win32config
奉上Makefile文件
path=E:\project\c++\os_kernel
build:
mkdir $(path)\build
$(path)\nasm-2.16.01\nasm hello.asm -o $(path)\build\hello.bin
$(path)\dd if=$(path)\build\hello.bin of=$(path)\build\hello.img bs=512 count=1
clean:
rmdir $(path)\build /s /q
bochs:
D:\software\Bochs-2.8\bochsdbg -q -f bochsrc

path改成自己文件夹的位置

成功了
最后
想编写这个操作系统的可以找我讨论,我建立了交流群,我拉大家进群,一起解决问题