操作系统实现-简单热身

博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935

这次对上次的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 文字 4025 2 01 文字 4025 16 02 文字 8025 2 03 文字 8025 16 04 图形 320320 2 05 图形 320320 4 06 图形 640*200 2

  • 初始化段寄存器

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

  • 显示文本

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

起始地址 结束地址 大小 用途

1KB 中断向量表

256B BIOS 数据区

29.75 KB 可用区域

512B MBR 加载区域

607.6KB 可用区域

1KB 扩展 BIOS 数据区

64KB 用于彩色显示适配器

32KB 用于黑白显示适配器

32KB 用于文本显示适配器

32KB 显示适配器 BIOS

160KB 映射内存

64KB-16B 系统 BIOS

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在高位

Original: https://www.cnblogs.com/shilinkun/p/16230050.html
Author: 小坤学习园
Title: 操作系统实现-简单热身

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球