操作系统实现-简单热身

shilinkun
2022-05-08 / 0 评论 / 144 阅读 / 正在检测是否收录...
博客网址:www.shicoder.top
微信:kj11011029
欢迎加群聊天 :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*252
01文字40*2516
02文字80*252
03文字80*2516
04图形320*3202
05图形320*3204
06图形640*2002
  • 初始化段寄存器

因为不能使用mov ds,0这种,因此借助ax进行初始化

  • 显示文本

由于BIOS加载之后,还是实模式,为了在这个模式下显示文本,我们需要知道要在哪个内存区域进行显示,下面给出实模式下的内存区域

起始地址结束地址大小用途
0x0000x3FF1KB中断向量表
0x4000x4FF256BBIOS 数据区
0x5000x7BFF29.75 KB可用区域
0x7C000x7DFF512BMBR 加载区域
0x7E000x9FBFF607.6KB可用区域
0x9FC000x9FFFF1KB扩展 BIOS 数据区
0xA00000xAFFFF64KB用于彩色显示适配器
0xB00000xB7FFF32KB用于黑白显示适配器
0xB80000xBFFFF32KB用于文本显示适配器
0xC00000xC7FFF32KB显示适配器 BIOS
0xC80000xEFFFF160KB映射内存
0xF00000xFFFEF64KB-16B系统 BIOS
0xFFFF00xFFFFF16B系统 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在高位

0

评论 (0)

取消