MBR引导程序源码理解
来源:http://www.tudoupe.com时间:2022-05-17
目录
- MBR 主导程序源理解
- 序
- 参考链接
- 关于在整个启动程序期间与MCBR指导方案的关系的简要说明
- 输入 BIOS 启动磁盘 。
- 从引导磁盘的第一段获取 MBR 数据 。
- 本页是2011年马拉维大选特别报导的一部分。
- 源码解读
- `00000000 EB63 jmp short 0x65`
- `00000065 FA cli`
- `00000066 90 nop`
- `00000067 90 nop`
- `00000068 F6C280 test dl,0x80`
- `0000006B 7405 jz 0x72`
- `00000072 B280 mov dl,0x80`
- `00000074 EA797C0000 jmp word 0x0:0x7c79`
- `00000079 31C0 xor ax,ax`
- `0000007B 8ED8 mov ds,ax`
- `0000007D 8ED0 mov ss,ax`
- `0000007F BC0020 mov sp,0x2000`
- `00000082 FB sti`
- `00000083 A0647C mov al,[0x7c64]`
- `00000086 3CFF cmp al,0xff`
- `00000088 7402 jz 0x8c`
- `0000008C 52 push dx`
- `0000008D BE057C mov si,0x7c05`
- `00000090 B441 mov ah,0x41`
- `00000092 BBAA55 mov bx,0x55aa`
- `00000095 CD13 int 0x13`
- API 描述: 13Hah=41H
- 例行行刑中断前 13Hah=41H
- "在13Hah=41H 常规执行过程中断"
- 13HA=41H 常规执行中断后
- `00000097 5A pop dx`
- `00000098 52 push dx`
- `00000099 723D jc 0xd8`
- `0000009B 81FB55AA cmp bx,0xaa55`
- `0000009F 7537 jnz 0xd8`
- `000000A1 83E101 and cx,byte +0x1`
- `000000A4 7432 jz 0xd8`
- `000000A6 31C0 xor ax,ax`
- `000000A8 894404 mov [si+0x4],ax`
- `000000AB 40 inc ax`
- `000000AC 8844FF mov [si-0x1],al`
- `000000AF 894402 mov [si+0x2],ax`
- `000000B2 C7041000 mov word [si],0x10`
- `000000B6 668B1E5C7C mov ebx,[0x7c5c]`
- `000000BB 66895C08 mov [si+0x8],ebx`
- `000000BF 668B1E607C mov ebx,[0x7c60]`
- `000000C4 66895C0C mov [si+0xc],ebx`
- `000000C8 C744060070 mov word [si+0x6],0x7000`
- `000000CD B442 mov ah,0x42`
- `000000CF CD13 int 0x13`
- `000000D1 7205 jc 0xd8`
- `000000D3 BB0070 mov bx,0x7000`
- `000000D6 EB76 jmp short 0x14e`
- `0000014E 60 pushaw`
- `0000014F 1E push ds`
- `00000150 B90001 mov cx,0x100`
- `00000153 8EDB mov ds,bx`
- `00000155 31F6 xor si,si`
- `00000157 BF0080 mov di,0x8000`
- `0000015A 8EC6 mov es,si`
- `0000015C FC cld`
- `0000015D F3A5 rep movsw`
- `0000015F 1F pop ds`
- `00000160 61 popaw`
- `00000161 FF265A7C jmp word [0x7c5a]`
- 通过绿色区块识别,由上述MCBR试点方案执行的命令
MBR 主导程序源理解
序
本文的目的不仅是调查MBR试点方案,这个方案有若干用途,而且还要找到GRUB2源代码,该源代码比反向翻译更有效。
然而,本研究的目的是记录一个学习过程,这一过程本身需要记录下来。
参考链接
- Linux嵌入式发展第四阶段
- 原始16比特x86机器代码如何比较?
- 来自伯德兄弟的Linux二等兵
- 组合调试命令和命令机码
- 主指南记录内存地址0x7C00的意义是什么?
- 为什么在x86中 BIOS 将 MBR 装入 0x7C00?
- 操作系统08比洛斯 一步一步推进到一个神奇的内存位置 0x7c00
- AVX2 CPU 命令设置
- BIOS 中止 [程序语言/编译]
- BIOS分机13中断大容量硬盘上的读写操作。
- 汇编的语言符号:CF、FF、FF、AF、ZF、SF、TF、DF、DF、DF
- grub2的源码
- - ARM 指南汇编汇编
- 扩展号 It13h 调用信息(已修改)
- INT 13
- 进入磁盘时使用 BIOS (INT 13h)。
- MBR (x86)
- Intel64和IA-32框架软件开发者文件文件的下载地点
- 1.S 阶段1.S 分析是GRUB概况介绍过程的第一阶段。
- 关于移动命令、移动命令和移动命令的细节
关于在整个启动程序期间与MCBR指导方案的关系的简要说明
引入来自伯德兄弟的Linux二等兵一书中的原文:
- (a) 以硬件信息、自我测试(自我检查)和根据设置接收初始启动装置的方式,装载BIOS。
- 在第一个启动设备(即:grub2, spfdisk等)中读取和执行 MBR 启动指南;
- 内核将开始定位硬件和载荷驱动器
- 当硬件驱动器成功时, Kernel 将自动调用系统程序, 并将其作为默认值使用 。
目标初始化系统和基础系统。 (a) 操作系统的目标准备;
启动多用户服务。 目标下的主机和服务器服务;
在目标下,执行多用户。/etc/rc.d/rc.local文件;
在目标下,执行多用户。 getty.target 及登录服务;
系统提供图形所需的服务。因为我的系统软件大部分 都储存在硬盘上因此,BIOS将确定哪些装置可以启动,以便我们能够在操作系统中进入磁盘上的核文件。然而,由于各种操作系统,存在若干档案系统格式。因此,我们必须启动一个试点方案,处理内核文件装载问题。因此,这个启动软件被称为“启动装载器”。所以,你把这个靴子装载器程序放在哪里了?在启动设备初始扇区( 区) 中,这就是我们一直在讨论的: 靴子大师记录。主引导记录)。
最后,启动装载器函数 [装入内核文件] 。
当 BIOS 读取此信息时, 启动设备的第一个 MBR 将会读取 Boot 装载器 。
Linux将程序代码执行和配置设置分为两个阶段(阶段)。
- 首先,运行布特装货机主软件
实施 " 靴式装载器 " 的主要软件处于第一阶段。主要软件必须安装在启动科。这是MBR或启动部门(启动秘密)。但如前所述,因为MBR不够充分因此,MBR或启动部门往往只安装靴式装载器最小的总程序。装入的装载器没有合适的配置文件 。- 主程序负载配置文件( 第2阶段)
第二步涉及装载所有与剖析档相关的环境参数文件(包括文件系统定义和主剖面图 grab.cfg);一般而言,所有配置文件都存在。/boot下面。所有 Gurb2 相关文件都存储在
/boot/grub2中。
输入 BIOS 启动磁盘 。

上图Removable Devices分类下没有设备,
所以排第一顺位的是Bootable Add-in Cards这个设备。
其次是VMware Virtual SCSI Hard Drive (0:0)这是我们在虚拟机模式下 唯一拥有的硬盘
经过试验,将
VMware Virtual SCSI Hard Drive (0:0)调整到初始位置, 然后打开, 过程和结果将会被保存。 它们都是正常的, 或者看起来是正常的 。Bootable Add-in Cards没有压倒一切的影响。
那么上面这个Bootable Add-in Cards它到底是什么?字面中文翻译是“能够指导启动的附加卡”, 我猜它应该是来自闪存盘或其他存储卡的快速指南, 不需要BIOS修改主顺序。
也就是说,现在你已经插入了方向盘, 优先引导引擎 从闪存盘,或者,在没有闪存盘的情况下,从二级硬盘。
总结:
铅盘通常用来引导交换机进入半人马系统..VMware Virtual SCSI Hard Drive (0:0)我们只需在人马座找到相关的硬盘设备 就可以进入下一步
从引导磁盘的第一段获取 MBR 数据 。
确认磁盘挂载
我不知道该如何展示它。
/dev/sda这个设备就是VMware Virtual SCSI Hard Drive (0:0)我只能确定,因为我只有一个虚拟系统配置的虚拟硬盘。/dev/sda
复制数据作为文件
说明:
1+0 records in有关第1号是一个部门,它是指磁盘中一个部门的总数。
最终将有一个文件:MBR.bin
内容是:
本页是2011年马拉维大选特别报导的一部分。
利用nasm命令反汇编
源码解读
BIOS 将把完整的 MBR (512 字节) 装入内存 。0x7C00位置
格式说明
为描述格式,请以第一个指示为例:0: eb 63 jmp 0x65
| (IP登记册)内存折中地址 | 机器操作码 | 记忆代码汇编和操作量 |
|---|---|---|
| 00000000 | EB63 | jmp short 0x65 |
00000000 EB63 jmp short 0x65
CPU执行jmp short 0x65指令的过程:
- 依赖 CS:IP 的 CPU CPU(如果适用)
7C00:00表示读取的记忆单位jmp short 0x65将读取命令输入命令缓冲; - 当 CS:IP = IP+ 命令长度读(2) 时, IP 指向下一个命令 。
7C00:02; - CPU执行指令
jmp short 0x65,IPIP登记值将更新为65
这里出现一个问题:第一线是跨越广大地区(02H65H)的转移令。这不是指令吗?
GRUB2源代码与GRUB2源代码的比较表明:
BIOS 参数区块使用此空格! 更改第一次跳跃或开始代码 。 在区域之后的任何地方( 下图中的蓝色区域) 。

00000065 FA cli
- CS CPU 读取时间: IP=
7C00:65处的指令(cli)到指令缓冲器。 - 更新CS:IP=
7C00:66 - CPU执行
cli该指令防止CPU中断,并确保目前执行的代码不被中断。
00000066 90 nop
- CS CPU 读取时间: IP=
7C00:66处的指令(nop)到指令缓冲器。 - 更新CS:IP=
7C00:67 - CPU执行
nop这是一个空操作指令, 仅用于在顶部和底部指令之间提供更多稳定时间 。
00000067 90 nop
- CS CPU 读取时间: IP=
7C00:67处的指令(nop)到指令缓冲器。 - 更新CS:IP=
7C00:68 - CPU执行
nop这是一个空操作指令, 仅用于在顶部和底部指令之间提供更多稳定时间 。
00000068 F6C280 test dl,0x80
test指令说明:
测试在两个参数(目标和源)上执行逻辑操作和逻辑操作,并根据未储存的结果设定标记内存。
TEST AX、BX具有与AX、BX相同的效力,但试验命令不改变AX和BX的内容,而AX和BX则改变。
在国旗登记册中,C、O、P、Z、S(C和O都定为零)也作了同样的改动。
船旗国登记册的运作结构如下:
- 当计算一个无符号数字时,它通常记录计算结果的最大有效值为较高值或较大的借方值。
- 总而言之,一个象征性数字操作的结果超出了该系统可以代表的溢出范围,一个是溢出,一个是溢出,零是无溢出。
- PF: Miraculous 路标。 它记录结果中所有位数中的一位数, 是否甚至当相关指令对偶数执行时, 1 和对奇数执行时, 0 和 0 。 实现原则, 从 0 到 0, 与相邻位置处于相同位置, 或者直到第七位, 或者结果就是 PF值 。
- 它记录了在执行适当指示后结果是否为零。 1 结果为0,0,结果不是0。
- 它记录了一旦执行所需指示后结果为负的结果。 1 表示的是负结果,0 表示的是非负结果,如果执行所需指示后结果为负结果,0 表示的是非负结果。 1 表示的是负结果,0 表示的是非负结果。
- CS CPU 读取时间: IP=
7C00:68处的指令(test dl,0x80)到指令缓冲器。 - 更新CS:IP=
7C00:6B - 执行指令
test dl,0x80
dl 登记显示驱动器号码( 80H 到 FFH ); 软驱动器从 0 开始, 硬驱动器从 80 开始。 因此, 下面是测试 dl 登记器是否从 80 开始, 显然这是测试它是否是一个硬驱动器 。
dl 注册没有任何价值。 确实如此 。0x0,将0x80和0x0做、经营和获取成果0x0重点突出的登记记录是:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
0000006B 7405 jz 0x72
- CS CPU 读取时间: IP=
7C00:6B处的指令(jz 0x72)到指令缓冲器。 - 更新CS:IP=
7C00:6D - 执行指令
jz 0x72
jz 指令,其效果是决定旗帜登记册的ZF标记是1还是1已经转让,因此j指令的执行取决于前一项指令的执行结果。
可知上一条指令test dl,0x80的结果是ZF=1,这些指示实际上表明,如果 dl 注册值不是80的起始值,表明它不是硬盘驱动器,那么IP注册值就会更新。72。
此时CS:IP=7C00:72
00000072 B280 mov dl,0x80
- CS CPU 读取时间: IP=
7C00:72处的指令(mov dl,0x80)到指令缓冲器。 - 更新CS:IP=
7C00:74 - 执行指令
mov dl,0x80,将80送入dl寄存器
本指示连同前一项指示将同时执行:决定 dl 登记从80(硬盘)开始,如果没有,则立即进行。
0x80送入dl覆盖。
00000074 EA797C0000 jmp word 0x0:0x7c79
- CS CPU 读取时间: IP=
7C00:74处的指令(jmp word 0x0:0x7c79)到指令缓冲器。 - 更新CS:IP=
7C00:79 - 执行指令
jmp word 0x0:0x7c79阅读 CS:IP 登记册0x7c79
由于某些不正确的 BIOS 跳到 07C0: 00/ 00, 而不是00: 7C00, 故使用这个序列作为解决问题的预防措施。
00000079 31C0 xor ax,ax
- CS CPU 读取时间: IP=
00:7C79处的指令(xor ax,ax)到指令缓冲器。 - 更新CS:IP=
00:7C7B - 执行指令
xor ax,ax总是检索在逻辑上不同于或自行计算到的 AX 注册值。0x0,然后将调查结果传送到AX登记册。 - 国旗注册号PF 奇形娃娃标记已改为 1。
0000007B 8ED8 mov ds,ax
- CS CPU 读取时间: IP=
00:7C7B处的指令(mov ds,ax)到指令缓冲器。 - 更新CS:IP=
00:7C7D - 执行指令
mov ds,ax。 此时AX=0x0,在 DS 登记册中初始化 AX,最终 DS =0x0
当 CPU 想要读取或写入内存模块时,此记忆单位的地址必须先指定 。在8086 CPU,内存地址由段落和偏移地址组成。8086号处理器包括一个DS登记册。通常储存待读数据的部分的地址。例如,我们必须阅读100H单元的内容。可在以下程序段落中这样做。
上面
[...]内存单位称为表单。[0]中的0基本上就是整个记忆单位的折叠地址mov al,[0]命令不提供地址, 当运行时, CPU 自动从 DS 登记册中提取值 。[...]此内存模块的分区地址 。 @ info: whatsthis
例如mov al,[0]就是指把1000:0此内存单位的值被发送到登记册 。
0000007D 8ED0 mov ss,ax
- CS CPU 读取时间: IP=
00:7C7D处的指令(mov ss,ax)到指令缓冲器。 - 更新CS:IP=
00:7C7F - 执行指令
mov ss,ax。 此时AX=0x0然后将AX列入党卫军登记册 最后是党卫军0x0
8086 CPU有两个登记簿,即部分登记簿(SS)和SP登记簿(SP),最高部分地址保留在SS,抵消地址记录在SP。
SS:SP指向栈顶元素。push指令和pop执行命令时, CPU 从 SS 和 SP 获得最高地址 。
0000007F BC0020 mov sp,0x2000
- CS CPU 读取时间: IP=
00:7C7F处的指令(mov sp,0x2000)到指令缓冲器。 - 更新CS:IP=
00:7C82 - 执行指令
mov sp,0x2000将 SP 登记值设定为 SP= 。0x2000
党卫军和SP目前都有明确的价值, 这个代码在此执行, 正式创建存储空间 。
SS:SP=00:2000
00000082 FB sti
- CS CPU 读取时间: IP=
00:7C82处的指令(sti)到指令缓冲器。 - 更新CS:IP=
00:7C83 - 执行指令
sti让 CPU 中断发生 。
这条指令和上面00000065 FA cli指令形成配合,在cli和sti戒严守则不会在外部中断,以便他们同时有效工作。
00000083 A0647C mov al,[0x7c64]
从 DS 仓库中删除值 。0x0作为[0x7c64]内存模块部分的地址是:0:7C64。
内存地址0:7C64启动磁盘是包含内核的磁盘, 0xff 表示正在使用启动磁盘 。
指令mov al,[0x7c64]它需要修改下调的AX字节AL登记册的价值如下:0xff
00000086 3CFF cmp al,0xff
cmp指令说明:
《议定书》/《公约》缔约方会议(比较)指示从计划的业务数量中减去源,但不改变业务数量。
与两个未符号的整数相比,标记结果如下:
CMP结果 ZF CF 目的操作数 < 源操作数 0 1 目的操作数 > 源操作数 0 0 来源业务=目的业务 1 0 这两个符号的标记结果见下表:
CMP结果 标志位 目的操作数 < 源操作数 SF ≠ OF 目的操作数 > 源操作数 SF=OF 来源业务=目的业务 ZF=1
cmp al,0xff说明将AL登记簿中的值与AL登记簿中的值进行比较。0xff的大小。
此时AL=0xff弹道检测结果相同,即旗帜登记册中的ZF=1;
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
00000088 7402 jz 0x8c
如果国旗内存标记 ZF 等于 1, 则传送jz 命令 。
ZF=1,jz 指令随后被传输,以设定 IP 值0x8c。
在此检查是否有必要的磁盘引用 。
0000008C 52 push dx
- CS CPU 读取时间: IP=
00:7C8C处的指令(push dx)到指令缓冲器。 - 更新CS:IP=
00:7C8D - 执行指令
push dx。
这是一个拥有独特进入模式的储存区,与进入空间的最后数据输入不同,该空间也是第一个离开的。
条目包括向顶部添加一个新的元素,而退出则包括从顶部删除一个元素。
当必须离开时, 顶部元素总是最后一个输入, 第一个从顶部撤回。 这被称为 LIFO( 最后一出, 返回和退出 ) 。8086 CPU有两个登记簿,即部分登记簿(SS)和SP登记簿(SP),最高部分地址保留在SS,抵消地址记录在SP。
SS:SP指向栈顶元素。push指令和pop执行命令时, CPU 从 SS 和 SP 获得最高地址 。
push dx今后的步骤将完成执行工作。
- SS:SP=码头地址
00:2000 - 数据宽度确定:DX登记数据为16位数,因此SP=SP-2=
0X1FFE - 删除上面的 DX 登记值。
00000072 B280 mov dl,0x80DX的低注册 dl 已经编程 与指令。0x80和整个DX=0x0080 - 将 DX 的内容传送到内存单位, 指向 SS: SP, 指向新屋顶 。
在现阶段,内部状态(H代表16位数)如下:
| 内存单元地址 | 数据 | SS:SP所在位置 | 来源 |
|---|---|---|---|
| 1FFEH | 80 | SS:SP | DX |
| 1FFFH | 00 | ||
| 2000H |
0000008D BE057C mov si,0x7c05
寄存器赋值:SI=0x7C05
共有4个登记册可供使用。
[...]是存储器中可能找到存储器的仓库之一。BX,DI,和BP是另外三个。
只要在
[...]除 DS 外, 请使用发件人 BP, 命令不包括特定地址, 即 SS 中的默认值 。
这是向磁盘地址软件包分配 SI 登记册的点 。
00000090 B441 mov ah,0x41
寄存器赋值:AH=0x41
登记器存储了即将到来的中断程序 的功能编号
Int 13 ah = 41 表示是否支持 LBA 位置模型 。
00000092 BBAA55 mov bx,0x55aa
寄存器赋值:BX=0X55AA
00000095 CD13 int 0x13
- CS CPU 读取时间: IP=
00:7C95处的指令(int 0x13)到指令缓冲器。 - 更新CS:IP=
00:7C97 - 执行指令
int 0x13。
内置命令以 Intn,n 形式写成,作为断开型代码,并启动中断过程。
如下所示,CPU执行与启动N干扰中断过程相似的内插指令:
- 从断开矢量数据库获取相关的断开程序条目地址(段落地址和抵消地址),使用断开类型 n。
- IF = 0,TF = 0, 签名登记录入;
此时SS:SP=00:1FFE16位符号登记册,SP=SP-2=1FFC;
此时,在以下登记册上标注:FLAG=0x0044=0000 0000 0100 0100
当我刚入行时,这里的顶部写着:0000:1FFD=0x00、0000:1FFC=0x44 - 16,SP=SP-2=CS Intrench 16,SP=SP-2=CS Intrench 16,SP=SP=SP-2=CS Intrench
1FFC:0000:1FFB=0x00、0000:1FFA=0x00 - 16 IP Intrench;SP=SP-2=
1FF8:0000:1FF9=0x7C、0000:1FF8=0x97 - (IP)=(n*4),IP计算=
0000:004C内存单元有16位元值。 - (CS)=(n*4+2)和计算CS=
0000:004E内存单元有16位元值。
当最后一步完成后, CPU 开始 。0x13(否)进程中断。
国旗登记国家管制标记:
状态控制标记用于规范CPU的操作,可使用特定指示更改。
- 当 TF 设为 1 时, CPU 进入一个单步执行模式, 即每个指令都执行, 导致一步骤中断请求。 这种方法主要用于进程调试 。
注:虽然命令系统中没有用于改变标签 TF 值的特别命令,但程序员可以通过在按键进入标签页后更新输入值来改变TF打字位置值。- 可中断的标志牌(IF)用于检测CPU是否响应CPU在CPU外可屏蔽断开的中断请求。当IF=1时,CPU 响应 CPU 外的可屏幕断开时的中断请求 。当IF=0时,CPU 不回应 CPU 外的屏蔽中断的中断请求 。
注:尽管标记值很高,但CPU必须对在CPU之外发出的中断请求和CPU内部产生的中断请求作出反应。- DF(方向标志):每次在字符串指令中操作后,如果 DF = 0, si, di 递增;如果 DF = 1, si, di 递增。
程序员确定 DF 值 。 (对于 DF, cld 命令为 0, std 命令为 1 。)
中断向量表:
使用断开矢量表格, CPU 使用 8 位断开型代码来定位中断过程的右条目地址。 中断矢量表格是中断处理器的条目地址列表 。
在内存中,保留与中断源相对应的中断处理过程有256个存取点的中断矢量表。
折叠矢量表为8086个处理器定义,这些处理器将放置在内存地址0,从1024个单位的10:00-00-至0.00:03FF。
中断例程:
时间顺序的中断是由矢量表所针对的处理器的中断造成的,名称只是描述性的。
在 CPU 进入终端功能的内部命令之前,标识登记、目前的CS和IP都已经加入到库存中。程序停止后,使用 iret 命令来恢复标记、 CS 和 IP 值, 然后再运行 int 命令 。在此之后, 应用程序将被运行 。
内置命令和 iret 逗号的组合与调用命令和 ret 命令的组合相同, 只是 iret 有 签名 登记, ret 没有 。所有破坏的最后一个顺序是iret, 一套指令中定义如下:
int 13H ah=41HAPI说明
检查是否可访问扩展名 。
入口:
- ah = 41H
- BX = 55AAH
- DL = 驱动器号
返回:
- CF = 0
- Ah = 扩展号的原版号
- al = 内部使用
- BX = AA55H
- CX 表示界面支持的比特面罩 。
- 1 通过数据包结构对设备进行访问
- 2 弹出和驱动器锁定
- 4 EDD(强化磁盘驱动器支持)
- CF = 1
- = 01H 错误代码,错误命令
此方法决定特定驱动器的扩展是否可用。 如果输入符号设置为 1, 此驱动器不支持扩展函数。 如果条目符号为 0 和 BX = AA55h, 则存在扩展。 0-bit CX 表示当前是否支持第一个子集, 而 1-bit 显示是否支持第二个子集 。
1. x 版本 Int13H 扩展, 主版本 AH = 1. AL 是一个替代版本编号,只有BIOS内部使用,软件无法检查。
int 13H ah=41H中断例程执行前
int 0x13执行指示前的标记登记条件如下:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
int 0x13在执行指示期间,在程序中断之前,储存空间的状况如下:
| 内存单元地址 | 数据 | SS:SP所在位置 | 来源 |
|---|---|---|---|
| 1FF8H | 97 | SS:SP | IP |
| 1FF9H | 7C | ||
| 1FFAH | 00 | CS | |
| 1FFBH | 00 | ||
| 1FFCH | 44 | FLAG | |
| 1FFDH | 00 | ||
| 1FFEH | 80 | DX | |
| 1FFFH | 00 | ||
| 2000H |
int 0x13 AH=41H在执行指令期间中断过程之前,不同输入参数的条件如下:
| 寄存器 | 数据 | 参数意义 |
|---|---|---|
| ah | 0x41 | 检查是否安装了扩展名 。 |
| BX | 0x55AA | 在中断之前指定值,以避免在初始 BX 值与中断的后果之间产生误解。0x55AA |
| dl | 0x80 | 驱动器号(80H至FFH);软驱动器在0时启动,硬驱动器在80时启动。 |
int 13H ah=41H中断例程执行过程
寄存器赋值:BX=0XAA55
int 13H ah=41H中断例程执行后
中断进程的最后一项命令由 iret 执行, 该命令恢复 CS: IP 和标签登记, 然后再返回主程序指令 。
- 离开商店后返回主程序 IP =
0x7C97 - 走出谷仓,回到掌握 CS=
0x0000 - 退出棚屋并重新启动主程序 FLAG =
0x0044
int 0x13 AH=41H下表显示每个出口参数在执行指令期间过程中断时的状态:
| 寄存器 | 数据 | 参数意义 |
|---|---|---|
| BX | 0xAA55 | 如果成功,则改为BX=0xAA55;否则保持不变。 |
| ah | 0x00 | 成功时,Aah等于版本编号;否则,Aah等于1。 |
| CS | 0x0000 | 出栈恢复中断前 |
| IP | 0x7C97 | 出栈恢复中断前 |
| FLAG | 0x0044 | 尽管如此,C.F. 表示为零或一。 |
执行伊雷特命令后,后方空间的状况如下:
| 内存单元地址 | 数据 | SS:SP所在位置 | 来源 |
|---|---|---|---|
| 1FFEH | 80 | SS:SP | DX |
| 1FFFH | 00 | ||
| 2000H |
00000097 5A pop dx
出栈:恢复DX=0x0080
| 内存单元地址 | 数据 | SS:SP所在位置 | 来源 |
|---|---|---|---|
| 2000H | SS:SP |
00000098 52 push dx
入栈:保存DX=0x0080
| 内存单元地址 | 数据 | SS:SP所在位置 | 来源 |
|---|---|---|---|
| 1FFEH | 80 | SS:SP | DX |
| 1FFFH | 00 | ||
| 2000H |
INT13,AH=41H,可能损坏了%dl。例如,在AST BIOS 1中,这种情况发生在 4。这是通过重复输入和退出来固定的。
00000099 723D jc 0xd8
- CS CPU 读取时间: IP=
00:7C99处的指令(jc 0xd8)到指令缓冲器。 - 更新CS:IP=
00:7C9B - 执行指令
jc 0xd8。
jc 和jnc 命令语句:
跳跳或跳不跳jc:标志CF=1
跳跳或跳不跳jnc:标志CF=0
当前标志寄存器:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
所以jc 0xd8不进行跳转。
jc指令与上面的int 13H ah=41H过程的中断是整个过程的一部分,后者的任务是确定BIOS是否允许扩展中断13英寸,如果得到支持,CF=0,否则CF=1。jc取决于 BIOS 是否允许延长 int13 中断,指示可用于为不同地点运行“次级程序指示”。支持LBA模式的新主机架以及Win98自己的DOS7操作系统通常都支持INT13的扩展。
0xd8 的指令是CHS 位置模式,这意味着如果 LBA 位置模式不可用,则使用CHS。
0000009B 81FB55AA cmp bx,0xaa55
- CS CPU 读取时间: IP=
00:7C9B处的指令(cmp bx,0xaa55)到指令缓冲器。 - 更新CS:IP=
00:7C9F - 执行指令
cmp bx,0xaa55。
Cmp比较了两个数值的大小,见上文。
此时 BX=0xAA55,与第二个立即数0xAA55因此,标签登记簿修改如下:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
0000009F 7537 jnz 0xd8
- CS CPU 读取时间: IP=
00:7C9F处的指令(jnz 0xd8)到指令缓冲器。 - 更新CS:IP=
00:7CA1 - 执行指令
jnz 0xd8。
现在的ZF牌位不等于零 所以..jnz 0xd8不进行跳转。
本指示应与上一项指示结合使用。jc 0xd8之后,再次对int 13H ah=41H订单中断的结果已经确认,BIOS对扩展号13的支持已经确认。
0xd8 的指令是CHS 位置模式,这意味着如果 LBA 位置模式不可用,则使用CHS。
000000A1 83E101 and cx,byte +0x1
- CS CPU 读取时间: IP=
00:7CA1处的指令(and cx,byte +0x1)到指令缓冲器。 - 更新CS:IP=
00:7CA4 - 执行指令
and cx,byte +0x1。
1 byte=8 bit
byte +0x1=0000 0001
以及说明:按地点和操作分列的
二元制每个对应方的一比一比一,即0;
命令和命令总是消除溢出和前方标记,并根据目标数值修改符号、零和奇特标志位置。
结果:
由于int13 ah=41检查了LBA是否得到支持,并询问为什么CX楼设为1层,表明支持LBA。
当命令执行时, cx=0x01
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 0 | 1 | 0 |
000000A4 7432 jz 0xd8
- CS CPU 读取时间: IP=
00:7CA4处的指令(jz 0xd8)到指令缓冲器。 - 更新CS:IP=
00:7CA6 - 执行指令
jz 0xd8。
此时标志位ZF=0
所以不进行跳转
000000A6 31C0 xor ax,ax
- CS CPU 读取时间: IP=
00:7C79处的指令(xor ax,ax)到指令缓冲器。 - 更新CS:IP=
00:7C7B - 执行指令
xor ax,ax总是检索在逻辑上不同于或自行计算到的 AX 注册值。0x0,然后将调查结果传送到AX登记册。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
000000A8 894404 mov [si+0x4],ax
它包括将 Si 登记册配置为磁盘地址包的说明。0x7c05
[si+0x4]默认地址是 ds 注册值.ds=0x0, 因此内存地址是00:7c09
已知AX=0x00
将 AX 注册值( 16 位) 写入内存 。00:7c09处的连续两个字节。
因此,这一步骤是为了记住分机主版号。
| 00:7c0aH | 00:7c09H |
|---|---|
| 0x00 | 0x00 |
000000AB 40 inc ax
Inc 命令只有一个动作, 返回操作数乘以操作数 。
已知AX=0x00
使用 0x01, 增加轴登记( 16 比特) 的值, 并返回到 AX 。
此时AX=0x01
000000AC 8844FF mov [si-0x1],al
[si-0x1]ds 注册( d), 其中表示整个 RAM 地址 =00:7c04
由于AX为0x001(16比特),其最低的字节登记簿为0x01。
写入内存00:7c04处1个字节。
| 00:7c0aH | 00:7c09H | … | 00:7c04H |
|---|---|---|---|
| 0x00 | 0x00 | … | 0x01 |
000000AF 894402 mov [si+0x2],ax
AX=0x001, ds=0, si=0x7c05
[si-0x1]ds 注册( d), 其中表示整个 RAM 地址 =00:7c07
将轴注册值写入内存 :
| 00:7c0aH | 00:7c09H | 00:7c08H | 00:7c07H | … | 00:7c04H |
|---|---|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x01 | … | 0x01 |
000000B2 C7041000 mov word [si],0x10
已知值: ds=0x0, si=0x7c05
[si]ds 注册( d), 其中表示整个 RAM 地址 =00:7c05
将立即数0x10写入内存:
| 00:7c0aH | 00:7c09H | 00:7c08H | 00:7c07H | … | 00:7c05H | 00:7c04H |
|---|---|---|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x01 | … | 0x10 | 0x01 |
000000B6 668B1E5C7C mov ebx,[0x7c5c]
ebx 是 bx 的扩展名, bx 是 16 位数注册名, ebx 是 32 位数注册名, bx 是 ebx 低字注册名 。
将内存00:7c5cebx登记册以连续四个字节(2个字)填充。
如磁盘头数据表所示,[0x7c5c]对应下表4个红色字节:

下表显示磁盘数据何时复制到内存:
| 00:7c5fH | 00:7c5eH | 00:7c5dH | 00:7c5cH |
|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x01 |
此内存数据应写入ebx=0x001。
000000BB 66895C08 mov [si+0x8],ebx
识别日期: ebx= 0x001, ds= 0x00, si= 0x7c05
[si+0x8]ds 表示内存地址 :00:7c0d
将ebx值写入内存 :
| 00:7c10H | 00:7c0fH | 00:7c0eH | 00:7c0dH | … | 00:7c0aH | 00:7c09H | 00:7c08H | 00:7c07H | … | 00:7c05H | 00:7c04H |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x01 | … | 0x00 | 0x00 | 0x00 | 0x01 | … | 0x10 | 0x01 |
000000BF 668B1E607C mov ebx,[0x7c60]
已知值: ebx= 0x001, ds= 0x00。
[0x7c60]ds 表示内存地址 :00:7c60
如磁盘头数据表所示,[0x7c60]对应下表4个红色字节:

下表显示磁盘数据何时复制到内存:
| 00:7c63H | 00:7c62H | 00:7c61H | 00:7c60H |
|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x00 |
此内存数据应写成ebx=0x100。
000000C4 66895C0C mov [si+0xc],ebx
已知值: ebx= 0x00, ds= 0x00, si= 0x7c05
[si+0xc]_ 其他协调员00:7c11
将ebx值写入内存 :
| 00:7c14H | 00:7c13H | 00:7c12H | 00:7c11H | 00:7c10H | 00:7c0fH | 00:7c0eH | 00:7c0dH | … | 00:7c0aH | 00:7c09H | 00:7c08H | 00:7c07H | … | 00:7c05H | 00:7c04H |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x01 | … | 0x00 | 0x00 | 0x00 | 0x01 | … | 0x10 | 0x01 |
000000C8 C744060070 mov word [si+0x6],0x7000
已知值: ds= 0x00, si= 0x7c05
[si+0x6]ds 表示内存地址( d) :00:7c0b
立即将 0x700 输入内存 :
| 00:7c14H | 00:7c13H | 00:7c12H | 00:7c11H | 00:7c10H | 00:7c0fH | 00:7c0eH | 00:7c0dH | 00:7c0cH | 00:7c0bH | 00:7c0aH | 00:7c09H | 00:7c08H | 00:7c07H | … | 00:7c05H | 00:7c04H |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x01 | 0x70 | 0x00 | 0x00 | 0x00 | 0x00 | 0x01 | … | 0x10 | 0x01 |
000000CD B442 mov ah,0x42
立即发送 0x42 立即。
命令的函数编号
000000CF CD13 int 0x13
再次执行了一条int13与前一个例子相反,这次aah = 42 表示一种不同的功能。
Ah = 42 函数 API 解释:
读取磁盘:
- 在磁盘地址套件结构中,输入相应值。
- 设置 DS:SI -> 内存中的磁盘地址包
- 做AH=0x42。
- 设置 DL = 驱动器编号 - 0x80 通常是 C 驱动器 。
- 发送整数 0x13 。
如果传输过程中发生错误,则设定推论标记。成功时,AH应设定为 0。
磁盘地址包格式:
| Offset | Size | Description |
|---|---|---|
| 0 | 1 | 包件的大小(24字节) |
| 1 | 1 | 总是 0 |
| 2 | 2 | 要发送的部门数量(某些BIOS上多达127个) |
| 4 | 4 | 转让缓冲(16位数抵消:16位数)(见附注1) |
| 8 | 4 | 低32位LBA,从48位开始 |
| 12 | 4 | LBBA 开始于48位位高16位位高 |
已知:
- DS:SI =
00:7c05,它代表磁盘地址软件包的地址 - 磁盘地址内容(部分已知数据与 DS:SI 和磁盘地址软件包格式一同显示):
软件包尺寸( 小型块块)
00:7c05H 0x10 要发送的部门数量(某些BIOS上多达127个)
00:7c08H 00:7c07H 0x00 0x01 转移缓冲(16位数抵消:16位数)
段h 段l 偏移地址h 偏移地址l 00:7c0cH 00:7c0bH 00:7c0aH 00:7c09H 0x70 0x00 0x00 0x00 低32位LBA,从48位开始
00:7c10H 00:7c0fH 00:7c0eH 00:7c0dH 0x00 0x00 0x00 0x01 LBBA 开始于48位位高16位位高
00:7c14H 00:7c13H 00:7c12H 00:7c11H 0x00 0x00 0x00 0x00
- AH = 0x42
- dl = 0x80
在记忆地址读取80号驱动器的第一个扇区(512字节)。0x7000处
应当指出,文件中提供的汇编代码是以记忆为基础的。
0x7c00地址是不同的; 不要混淆或隐藏它 。
000000D1 7205 jc 0xd8
- CS CPU 读取时间: IP=
00:7CD1处的指令(jc 0xd8)到指令缓冲器。 - 更新CS:IP=
00:7CD3 - 执行指令
jc 0xd8。
jc 和jnc 命令语句:
跳跳或跳不跳jc:标志CF=1
跳跳或跳不跳jnc:标志CF=0
假设int 13H ah=42H由于成功使用读磁盘数据进行内存,CF标签重新定位为0,目前的标签登记为:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF溢出 | DF | IF | TF | SF符号 | ZF零 | AF | PF奇偶 | CF进位 | |||||||
| 0 | 0 | 1 | 1 | 0 |
所以jc 0xd8不进行跳转。
0xd8是在 CHS 位置模式下再次尝试,如果磁盘无法读取。
000000D3 BB0070 mov bx,0x7000
- CS CPU 读取时间: IP=
00:7CD3处的指令(mov bx,0x7000)到指令缓冲器。 - 更新CS:IP=
00:7CD6 - 执行指令
mov bx,0x7000。
寄存器赋值:BX=0x7000
000000D6 EB76 jmp short 0x14e
已知CS:IP=00:7CD6
无条件跳转到0x14e地址的指挥所。 CS: IP = 互联网协议00:7D4E
0000014E 60 pushaw
pusha: push all
统一登记(按英文字母顺序排列)
0000014F 1E push ds
登记册DS被压入仓库,DS在更新前保存好,并指示他们再次按到仓库,以便恢复。
00000150 B90001 mov cx,0x100
寄存器赋值:CX=0x100,作为后续rep指令的重复次数
00000153 8EDB mov ds,bx
已知BX=0x7000
寄存器赋值DS=0x7000
00000155 31F6 xor si,si
- CS CPU 读取时间: IP=
00:7D55处的指令(xor si,si)到指令缓冲器。 - 更新CS:IP=
00:7D57 - 执行指令
xor si,si总是检索在逻辑上不同于或自行计算到的 AX 注册值。0x0,然后将数据传送到SI登记册。 - 国旗注册号PF 奇形娃娃标记已改为 1。
此时DS:SI =7000:00
00000157 BF0080 mov di,0x8000
注意:
0x8000这是GRUB飞行员的内部内核地址
寄存器赋值DI=0x8000
0000015A 8EC6 mov es,si
已知:SI=0x00
寄存器赋值ES=0x00
0000015C FC cld
已知:
- SI=
0x00 - DI=
0x8000
DF = 标签登记更新0
国旗登记国家管制标记:
状态控制标记用于规范CPU的操作,可使用特定指示更改。
- 当 TF 设为 1 时, CPU 进入一个单步执行模式, 即每个指令都执行, 导致一步骤中断请求。 这种方法主要用于进程调试 。
注:虽然命令系统中没有用于改变标签 TF 值的特别命令,但程序员可以通过在按键进入标签页后更新输入值来改变TF打字位置值。- 可中断的标志牌(IF)用于检测CPU是否响应CPU在CPU外可屏蔽断开的中断请求。当IF=1时,CPU 响应 CPU 外的可屏幕断开时的中断请求 。当IF=0时,CPU 不回应 CPU 外的屏蔽中断的中断请求 。
注:尽管标记值很高,但CPU必须对在CPU之外发出的中断请求和CPU内部产生的中断请求作出反应。- DF(方向标志):每次在字符串指令中操作后,如果 DF = 0, si, di 递增;如果 DF = 1, si, di 递增。
程序员确定 DF 值 。 (对于 DF, cld 命令为 0, std 命令为 1 。)
0000015D F3A5 rep movsw
已知:
- DS:SI=
7000:00 - ES:DI=
00:8000 - CX=
0x100 - DF=
0
指令说明:
rep:(重读我之后)
调控命令函数用于重复以下命令,这是本例的一个前缀。rep movsw,就是重复执行movsw指令
当调控命令被运行时,它读取 ecx 注册的值,如果 cx/ ecx 大于 0, 后一个语句将被执行, 执行时, cx/ ecx 减少一个, 代表背后的指令被执行 。movsw:从源地址向目的地地址传输数据的指示。
16位模式下:
DS:SI是源地址。坐标是ES:DI。
32位模式下:
DS:ESI是源地址。 URL是 ES: EDI 。
应当指出,一旦传输完成,SI和DI(或ESI和EDI)就会提高或减少。
当 DF = 0时,这意味着在传输后,SI和DI(或ESI和EDI)值会增加。
当DF=1时,表示反向转移,在传输后SI和DI(或ESI和EDI)的价值下降。movsba 在SI和DI(或ESI和EDI)之后转移的字节加/减1
movsw加/减2,在SI和DI(或ERSI和EDI)之后传一个字
movsd:在 SI 和 DI (或 ESI 和 EDI) 之后发送双单词加/减 4 。基本 movsb/ movsw/ movsd 命令只能使用一次 。如果您想要处理器自动和多次运行,请使用命令前缀代表可以附加,传输数量可以配置在注册的 CX (16比特模式) 或 ECX (32比特模式) 中。当CX/ECX大于零时,在完成movsb/movsw/movsd后,一个降低CX/ECX的价值。直到减为0为止。
指令作用:
将7000:00至7000:100% 1 和% 1 之间的内存数据已传送到% 1 。00:8000至00:8100之间。
0000015F 1F pop ds
恢复 DS 登记册的价值,并修复由该子代码造成的任何记忆腐败。
00000160 61 popaw
恢复共同登记值,并修复该子编码造成的内存值损害。
00000161 FF265A7C jmp word [0x7c5a]
这取决于磁盘的放置情况。[0x7c5a]的值是0x8000
所以它就像,从头开始..00:8000处的内核指令了。
在那之前,MBR飞行员已经过期了
通过绿色区块识别,由上述MCBR试点方案执行的命令

上一篇:pe界面安装驱动
下一篇:联想g5075m进入bios
相关新闻
- 2023-05-07 u盘启动盘制作向导(如何制作u盘启
- 2023-05-07 小白u盘启动盘软件下载(u盘启动盘
- 2023-05-07 u盘启动盘里的iso文件需要解压(is
- 2023-05-07 k555lu盘启动盘(u盘启动盘怎么进入
- 2023-05-07 u盘启动盘cmos(U盘启动盘装系统)
- 2023-05-07 电脑pe制作u盘启动盘(微pe制作u盘启
- 2023-05-07 u盘启动盘改ntfs格式化吗(u盘格式化
- 2023-05-07 深度装机大师恢复u盘启动盘(深度装
- 2023-05-07 win7系统制作到u盘启动盘(如何制作
- 2023-05-06 u盘启动盘制作工具efi(U盘启动盘制
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
