操作系统实现-简单热身
博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935
这次对上次的boot.asm进行代码讲解,也可以对汇编的相关理论进行补充
boot.asm
主引导扇区位于硬盘的0柱面0磁头1扇区处,首先BIOS加电后,就会将主引导程序加载进来,然后执行
我们先看下boot.asm中有啥把
[org 0x7c00]
; 设置屏幕模式为文本模式,清除屏幕
mov ax, 3
int 0x10
; 初始化段寄存器
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
; 0xb8000 文本显示器的内存区域
mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'
; 阻塞
jmp $
; 填充 0
times 510 - ($ - $$) db 0
; 主引导扇区的最后两个字节必须是 0x55 0xaa
; dw 0xaa55
db 0x55, 0xaa
- 0x7c00
因为bios在上电之后,会去将boot主引导程序加载到0x7c00,然后利用一个跳转,跳到0x7c00处执行,因此我们需要将boot.asm代码放在0x7c00处,org便是这个功能
- 设置屏幕为文本模式
mov ax, 3
int 0x10
int 0x10为bios中断服务,给定不同的ax,会进行不同的调用程序,下表给出ax=3时候的程序
AL | 文字/图形 | 分表率 | 颜色 |
---|---|---|---|
00 | 文字 | 40*25 | 2 |
01 | 文字 | 40*25 | 16 |
02 | 文字 | 80*25 | 2 |
03 | 文字 | 80*25 | 16 |
04 | 图形 | 320*320 | 2 |
05 | 图形 | 320*320 | 4 |
06 | 图形 | 640*200 | 2 |
- 初始化段寄存器
因为不能使用mov ds,0
这种,因此借助ax
进行初始化
- 显示文本
由于BIOS加载之后,还是实模式,为了在这个模式下显示文本,我们需要知道要在哪个内存区域进行显示,下面给出实模式下的内存区域
起始地址 | 结束地址 | 大小 | 用途 |
---|---|---|---|
0x000 |
0x3FF |
1KB | 中断向量表 |
0x400 |
0x4FF |
256B | BIOS 数据区 |
0x500 |
0x7BFF |
29.75 KB | 可用区域 |
0x7C00 |
0x7DFF |
512B | MBR 加载区域 |
0x7E00 |
0x9FBFF |
607.6KB | 可用区域 |
0x9FC00 |
0x9FFFF |
1KB | 扩展 BIOS 数据区 |
0xA0000 |
0xAFFFF |
64KB | 用于彩色显示适配器 |
0xB0000 |
0xB7FFF |
32KB | 用于黑白显示适配器 |
0xB8000 |
0xBFFFF |
32KB | 用于文本显示适配器 |
0xC0000 |
0xC7FFF |
32KB | 显示适配器 BIOS |
0xC8000 |
0xEFFFF |
160KB | 映射内存 |
0xF0000 |
0xFFFEF |
64KB-16B | 系统 BIOS |
0xFFFF0 |
0xFFFFF |
16B | 系统 BIOS 入口地址 |
可以看出在0xb8000处可以显示文本,因此
mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'
相当于是 move byte ds:[0], 'H'
实模式下寻址方式为
( 16 位段基址 << 4 ) + 16 位偏移地址
ds << 4 + 0 = 0xb8000
- 0x55aa
若一段程序结束的魔数为0x55aa,BIOS才会认为是合格的主引导程序
注意,在汇编代码中,若定义一个数字 ,左边是高位
比如 dw 0xaa55,则编译之后,aa在高位