操作系统学习笔记 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

原文地址:https://www.cnblogs.com/zhuyingchun/p/4924291.html