Site Overlay

X86 汇编笔记:第 5 章 编写主引导扇区代码

问题

什么是主引导扇区

主引导扇区(Main Boot Sector,MBR)就是 BIOS 启动后最先读取的扇区。也就是硬盘的 0 面 0 道 1 扇区。

读取的主引导扇区数据有 512 字节,BIOS 将它加载到逻辑地址 0x0000:0x7c00 处,也就是(内存中的,下略)物理地址 0x07c00 处,然后判断它是否有效。

怎么判断主引导扇区是否有效?

如果其最后两字节为 0x55 和 0xAA 就说明有效。

文字如何显示在屏幕上?

显卡通过控制像素,可以控制显示器的显示。问题转化为:显卡如何控制像素,使之组合为文字?

一个像素由 R G B 三个值决定。每个值的取值范围是 $[0,2^8-1]$,而这三个值存放在显存中。所以显卡只需要控制显存,就可以控制显示在屏幕上的像素。

显卡加电后,都会初始化为 25 行 80 列的显示状态。物理地址空间 $[0xB8000,0xBFFFF]$ 留给显卡,用来显示文本。

几个基本的汇编指令和语法

mov

mov ax, 0xb800 ;表示把立即数 0xb800 传给 ax
mov es, ax ;表示把 ax 的内容传给 es

字符字面值表示 ASC 码

0x4c 等效于 'L'

byte 关键字修饰操作数

mov byte [0x00], 'L'

byte 表明传送的方式是字节方式,也就是表示 0x00 是八位的 0x00。
word 表明传送的方式是字方式。也就是两字节,表示 0x00 是十六位的 0x00

标号和 jmp

标号可以用来指代指令的汇编地址

infi: jmp near infi ;跳转到 infi
infi jmp near infi ;这么写也对

db

DB(Declare Byte)申明每个操作数占有一个字节。

MESSAGE DB 'test' ;表示声明 t, e, s, t 各占一个字节

dw

DW(Declare Word)申明每个操作数占有两个字节(一个字)。

伪指令

伪指令(Pseudo instruction)是用于告诉汇编程序如何进行汇编的指令。 它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。DB, DW 都是伪指令。

div

div 用于除法运算。可用于两种除法:

  • 16bits / 8bits
    例如:

    div cl
    div byte [0x0023]

    表示用 cl 的值做除数,而被除数需要我们提前放到 ax 里。执行后,cl 的值不变,al 存放商,ah 存放余数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注