操作系统学习笔记 005 引导扇区
引导扇区
BIOS运行完后,加载启动盘(BIOS里设置的)的MBR(主引导区)
512字节,以0xaa55作为结束标志,否则就认为是不可引导的
这段代码会加载到内存的07c00h位置,然后从这里开始执行
汇编代码
boot.asm
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
编译运行
# nasm boot.asm -o boot.bin
# bximage ;按照提示生成一个1.44M的软盘镜像文件a.img
# dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
# dd --help ;查看dd命令的帮助
把fdos-10meg/bochsrc.txt复制过来,删除其中ata的配置,添加:
floppya: 1_44=a.img, status=inserted
boot=floppy
# bochs
启动的虚拟机屏幕左上角有一个红色的Hello, OS world!
汇编基础
MOV指令
源\目标 |
通用寄存器 |
段寄存器 |
控制寄存器 |
调试寄存器 |
内存 |
立即数 |
Y |
- |
- |
- |
Y |
通用寄存器 |
Y |
Y |
Y |
Y |
Y |
段寄存器 |
Y |
- |
- |
- |
Y |
控制寄存器 |
Y |
- |
- |
- |
- |
调试寄存器 |
Y |
- |
- |
- |
- |
内存 |
Y |
Y |
- |
- |
- |
$ 所在源代码行的地址
$$ 当前段开始出的地址
$-$$ 当前行所在当前段内的偏移
call 修改IP或同时修改CS+IP,相当于
push CS
push IP
jmp far/near ptr 标号
ret 用栈中的数据修改IP,实现近转移,相当于
pop IP
retf 用栈中的数据修改CS+IP,实现远转移,相当于
pop IP
pop CS
关于10h号中断,这个帖子写得很好:
http://blog.csdn.net/hua19880705/article/details/8125706