对应书中第2.3节:让mbr飞一会 第58页
在电脑未开机前,BIOS就被加载到内存的F0000~FFFFF中。此区域为ROM
MBR被加载到磁盘的0盘0道1扇区(CHS方式)
CHS 方式中扇区的编号是从1开始的
当电脑按下power键后,cs:ip会被强制置为F000:FFF0 ,所以cpu会执行内存地址FFFF0处的指令。
FFFF0处的指令为跳转指令jmp far f000:e05b。
跳转后,BIOS便马不停蹄地检测内存、显卡等外设信息,当检测通过,并初始化好硬件后,开始在内存中 0x000~0x3FF处建立数据结构,中断向量表 IVT 并填写中断例程。
BIOS 最后一项工作校验启动盘中位于0盘0道1扇区的内容。
如果此扇区末尾的两个字节分别是魔数0x55和0xaa,就会把该扇区内容加载到内存地址 0x7c00处,
然后执行跳转指令jmp 0: 0x7c00
编写mbr.s程序,该程序可以在显示屏打印字段。将该程序加载到磁盘的0盘0道1扇区,使用bochs模拟,确保当计算机执行完BIOS后可以执行mbr.s,在显示屏打印字段。
; mbr.S
; 主引导程序
; --------------------------------------------------
SECTION MBR vstart=0x7c00 ; 把起始地址编译为 0x7c00
mov ax, cs ; cs 代码段寄存器
mov ds, ax ; dx 数据段寄存器
mov es, ax ; es 附加段寄存器
mov ss, ax ; ss 堆栈段寄存器
mov fs, ax ; fs 80386 后添加的寄存器,无全称
mov sp, 0x7c00 ; sp 堆栈指针寄存器
; 清屏
; --------------------------------------------------
; INT 0x10 功能号: 0x06 功能描述:上卷窗口
; --------------------------------------------------
; 输入:
; AH 功能号 = 0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL, CH) = 窗口左上角的 (X, Y) 位置
; (DL, DH) = 窗口右下角的 (X, Y) 位置
; 无返回值:
mov ax, 0x600
mov bx, 0x700
mov cx, 0
mov dx, 0x184f ; 右下角: (80, 25)
; VGA 文本模式种,一行只能容纳 80 个字符,共 25 行
; 下标从 0 开始,所以 0x18=24, 0x4f=79
int 0x10 ; int 0x10
;;;;;;;;;;;;;下面这三行代码获取光标位置;;;;;;;;;;;;;;;;
; .get_cursor 获取当前光标位置,在光标处打印字符
mov ah, 3 ; 3 号子功能
mov bh, 0 ; 待获取光标的页号
int 0x10 ; 输出:
; ch = 光标开始行,cl = 光标结束行
; dh = 光标所在行号,dl = 光标所在列号
; 打印字符串
mov ax, message
mov bp, ax ; es:bp 为串首地址
mov cx, 5 ; cx 为串长度,不包括结束符 '\0'
mov ax, 0x1301 ; 13 号子功能
; ah = 13
; al = 01: 写字符方式,显式字符串,光标跟随移动
mov bx, 0x2 ; bh = 0,要显示的页号
; bl = 02,字符属性,黑底绿字
int 0x10
;;;;;;;;;;;;;;;;;;;;;;打印字符串结束;;;;;;;;;;;;;;;;
jmp $; 程序悬停在此
message db "1 MBR"
times 510-($-$$) db 0
db 0x55,0xaa
./bximage -mode=create -imgmode=flat -hd=60 -q Seven.img
效果图
注:此命令和书上不同,因为环境版本不同 -size会报错。
输入命令
./bximage --help
可查看自己环境支持的命令
效果图
nasm -o mbr.bin mbr.s
将mbr.s编译成mbr.min。
dd if=/你的mbr.bin的路径/mbr.bin of=/你的自定义硬盘的路径/自定义硬盘名称 bs=512 count=1 seek=0 conv=notrunc
比如我自己的
dd if=/home/Seven/bochs2.68/bin/mbr.bin of=/home/Seven/bochs2.68/bin/Seven.img bs=512 count=1 seek=0 conv=notrunc
输入命令
./bochs -f bochsrc.disk
然后输入c继续。
推荐阅读: 大早上更新了Visual Studio 2019 试用一下 一.前言 Visual Studio 20...
在之前的文章里(《在Win10使用WSL2跑Docker,C盘空间不足焦虑症你有吗?》)我们治...
在新的MySQL 8.0.23中,引入了新的有趣功能:不可见列。 这是第一篇关于这个新功...
利用条件编译控制 基本知识 #define 定义一个预处理宏#undef 取消宏的定义#if 编...
追本溯源,从使用开始 首先看一下我们通常是如何使用微软自带的认证,一般在Star...
容器很棒,让你可以将你的应用连同其依赖项一起打包,并在任何地方运行。从 2013...
为了防止步骤上的失误,造成不成功,我尽量每一步的过程都写清楚 一、生成DLL 1....
微信小程序可谓是今天最火的一个名词了,一经出现真是轰炸了整个开发人员,当然...
前言 本文主要介绍的是关于.NET Core单文件发布静态编译AOT CoreRT,将.NET Core...
啥都不说了,直接奉献原代码 复制代码 代码如下: '==========注意==============...