先了解 CPU 的两种工作模式:实模式和保护模式
实模式(英语:Real mode)是 Intel 80286 和之后的 x86 兼容 CPU 的操作模式。实模式的特性是一个 20 比特的区段存储器地址空间(意思为只有 1MB 的存储器可以被寻址),可以直接软件访问 BIOS 程序以及周边硬件,没有任何硬件等级的存储器保护观念或多任务。
保护模式:寻址采用 32 位段和偏移量,最大寻址空间 4GB,最大分段 4GB (Pentium Pre 及以后为 64GB)。在保护模式下 CPU 可以进入虚拟 8086 方式,这是在保护模式下的实模式程序运行环境。
实模式的寻址方式是:cs<4+ip
MBR 的大小必须是 512 字节,这是为了保证魔数 0x55 和 0xaa 恰好出现在该扇区的最后两个字节处。由于 bochs 模拟的是 x86 平台,所以是小端字节序,故最后两个字节的内容是 0xaa55.
编写 MBR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| ;主引导程序 ;----------------------------------------------------- SECTION MBR vstart=0x7c00 mov ax,cs mov ds,ax mov es,ax mov ss,ax mov fs,ax mov sp,0x7c00
; 清屏利用0x06号功能,上卷全部行,则可清屏 ; ----------------------------------------------------- ; INT 0x10 功能号:0x06 功能描述:上卷窗口 ;输入: ;AH 功能号=0x06 ;AL = 上卷的行数 ;BH = 上卷行属性 ;(CL,CH) = 窗口左下角的(X,Y)位置 ;(DL,DH) = 窗口右下角的(X,Y)位置 ;无返回值 mov ax,0x600 mov bx,0x700 mov cx,0 ; 左上角: (0,0) mov dx,0x184f ; 右下角:(80,25) ; 下标从0开始,所以0x18=24,0x4f=79 int 0x10 ; int 0x10
;;;;;;;; 下面这三行代码获取光标位置 ;;;;;;;; ;.get_cursor获取当前光标位置,在光标位置处打印字符。 mov ah,3 ; 输入:3号子功能是获取光标位置,需要存入ah寄存器 mov bh,0 ; bh寄存器存储的是待获取光标的页号
int 0x10 ; 输出:ch=光标开始行,c1=光标结束行 ; dh=光标所在行号,dl=光标所在列号
;;;;;;;; 获取光标位置结束 ;;;;;;;;
;;;;;;;; 打印字符串 ;;;;;;;; ; 还是用10h中断,不过这次调用13号子功能打印字符串 mov ax, message mov bp,ax ; es:bp 为串首地址,es此时同cs一致, ; 开头时已经为sreg初始化
; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略 mov cx,11 ; cx为串长度,不包括结束符0的字符个数 mov ax, 0x1301 ; 子功能号13显示字符及属性,要存入ah寄存器, ; al 设置写字符方式 ah=01:显示字符串,光标跟随移动 mov bx, 0x2 ; bh存储要显示的页号,此处是第0页, ; bl中是字符属性,属性黑底绿字(bl= 02h) int 0x10 ; 执行BIOS 0x10号中断 ;;;;;;;; 打印字符串结束 ;;;;;;;;
jmp $ ; 程序悬停在此
message db "Hello World" times 510-($-$$) db 0 db 0x55,0xaa
|
编译
nasm mbr.S -o mbr.bin
将 MBR 写入磁盘
dd if=./mbr.bin of=./hd60M.img bs=512 count=1 conv=notrunc
输出下述结果,证明写入成功。
1 2 3
| 1+0 records in 1+0 records out 512 bytes copied, 0.000183707 s, 2.8 MB/s
|
启动 bochs,在命令行输入 c 回车,此时窗口中显示出打印的字符。
附 1:dd 命令参数解释
1 2 3 4 5 6
| if=FILE of=FILE bs=BYTES count=BLOCKS seek=BLOCKS conv=CONVS
|
参考文章
- 《操作系统真象还原》第 2 章