U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > bios设置U盘启动 >

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源代码,该源代码比反向翻译更有效。

然而,本研究的目的是记录一个学习过程,这一过程本身需要记录下来。

参考链接

  1. Linux嵌入式发展第四阶段
  2. 原始16比特x86机器代码如何比较?
  3. 来自伯德兄弟的Linux二等兵
  4. 组合调试命令和命令机码
  5. 主指南记录内存地址0x7C00的意义是什么?
  6. 为什么在x86中 BIOS 将 MBR 装入 0x7C00?
  7. 操作系统08比洛斯 一步一步推进到一个神奇的内存位置 0x7c00
  8. AVX2 CPU 命令设置
  9. BIOS 中止 [程序语言/编译]
  10. BIOS分机13中断大容量硬盘上的读写操作。
  11. 汇编的语言符号:CF、FF、FF、AF、ZF、SF、TF、DF、DF、DF
  12. grub2的源码
  13. - ARM 指南汇编汇编
  14. 扩展号 It13h 调用信息(已修改)
  15. INT 13
  16. 进入磁盘时使用 BIOS (INT 13h)。
  17. MBR (x86)
  18. Intel64和IA-32框架软件开发者文件文件的下载地点
  19. 1.S 阶段1.S 分析是GRUB概况介绍过程的第一阶段。
  20. 关于移动命令、移动命令和移动命令的细节

关于在整个启动程序期间与MCBR指导方案的关系的简要说明

引入来自伯德兄弟的Linux二等兵一书中的原文:

  1. (a) 以硬件信息、自我测试(自我检查)和根据设置接收初始启动装置的方式,装载BIOS。
  2. 在第一个启动设备(即:grub2, spfdisk等)中读取和执行 MBR 启动指南;
  3. 内核将开始定位硬件和载荷驱动器
  4. 当硬件驱动器成功时, 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指令的过程:

  1. 依赖 CS:IP 的 CPU CPU(如果适用)7C00:00表示读取的记忆单位jmp short 0x65将读取命令输入命令缓冲;
  2. 当 CS:IP = IP+ 命令长度读(2) 时, IP 指向下一个命令 。7C00:02
  3. CPU执行指令jmp short 0x65,IPIP登记值将更新为65

这里出现一个问题:第一线是跨越广大地区(02H65H)的转移令。这不是指令吗?

GRUB2源代码与GRUB2源代码的比较表明:

BIOS 参数区块使用此空格! 更改第一次跳跃或开始代码 。 在区域之后的任何地方( 下图中的蓝色区域) 。

在这里插入图片描述

00000065 FA cli

  1. CS CPU 读取时间: IP=7C00:65处的指令(cli)到指令缓冲器。
  2. 更新CS:IP=7C00:66
  3. CPU执行cli该指令防止CPU中断,并确保目前执行的代码不被中断。

00000066 90 nop

  1. CS CPU 读取时间: IP=7C00:66处的指令(nop)到指令缓冲器。
  2. 更新CS:IP=7C00:67
  3. CPU执行nop这是一个空操作指令, 仅用于在顶部和底部指令之间提供更多稳定时间 。

00000067 90 nop

  1. CS CPU 读取时间: IP=7C00:67处的指令(nop)到指令缓冲器。
  2. 更新CS:IP=7C00:68
  3. 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 表示的是非负结果。
  1. CS CPU 读取时间: IP=7C00:68处的指令(test dl,0x80)到指令缓冲器。
  2. 更新CS:IP=7C00:6B
  3. 执行指令test dl,0x80

dl 登记显示驱动器号码( 80H 到 FFH ); 软驱动器从 0 开始, 硬驱动器从 80 开始。 因此, 下面是测试 dl 登记器是否从 80 开始, 显然这是测试它是否是一个硬驱动器 。

dl 注册没有任何价值。 确实如此 。0x0,将0x800x0做、经营和获取成果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

  1. CS CPU 读取时间: IP=7C00:6B处的指令(jz 0x72)到指令缓冲器。
  2. 更新CS:IP=7C00:6D
  3. 执行指令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

  1. CS CPU 读取时间: IP=7C00:72处的指令(mov dl,0x80)到指令缓冲器。
  2. 更新CS:IP=7C00:74
  3. 执行指令mov dl,0x80,将80送入dl寄存器

本指示连同前一项指示将同时执行:决定 dl 登记从80(硬盘)开始,如果没有,则立即进行。0x80送入dl覆盖。

00000074 EA797C0000 jmp word 0x0:0x7c79

  1. CS CPU 读取时间: IP=7C00:74处的指令(jmp word 0x0:0x7c79)到指令缓冲器。
  2. 更新CS:IP=7C00:79
  3. 执行指令jmp word 0x0:0x7c79阅读 CS:IP 登记册0x7c79

由于某些不正确的 BIOS 跳到 07C0: 00/ 00, 而不是00: 7C00, 故使用这个序列作为解决问题的预防措施。

00000079 31C0 xor ax,ax

  1. CS CPU 读取时间: IP=00:7C79处的指令(xor ax,ax)到指令缓冲器。
  2. 更新CS:IP=00:7C7B
  3. 执行指令xor ax,ax总是检索在逻辑上不同于或自行计算到的 AX 注册值。0x0,然后将调查结果传送到AX登记册。
  4. 国旗注册号PF 奇形娃娃标记已改为 1。

0000007B 8ED8 mov ds,ax

  1. CS CPU 读取时间: IP=00:7C7B处的指令(mov ds,ax)到指令缓冲器。
  2. 更新CS:IP=00:7C7D
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7C7D处的指令(mov ss,ax)到指令缓冲器。
  2. 更新CS:IP=00:7C7F
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7C7F处的指令(mov sp,0x2000)到指令缓冲器。
  2. 更新CS:IP=00:7C82
  3. 执行指令mov sp,0x2000将 SP 登记值设定为 SP= 。0x2000

党卫军和SP目前都有明确的价值, 这个代码在此执行, 正式创建存储空间 。

SS:SP=00:2000

00000082 FB sti

  1. CS CPU 读取时间: IP=00:7C82处的指令(sti)到指令缓冲器。
  2. 更新CS:IP=00:7C83
  3. 执行指令sti让 CPU 中断发生 。

这条指令和上面00000065 FA cli指令形成配合,在clisti戒严守则不会在外部中断,以便他们同时有效工作。

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

  1. CS CPU 读取时间: IP=00:7C8C处的指令(push dx)到指令缓冲器。
  2. 更新CS:IP=00:7C8D
  3. 执行指令push dx

这是一个拥有独特进入模式的储存区,与进入空间的最后数据输入不同,该空间也是第一个离开的。

条目包括向顶部添加一个新的元素,而退出则包括从顶部删除一个元素。
当必须离开时, 顶部元素总是最后一个输入, 第一个从顶部撤回。 这被称为 LIFO( 最后一出, 返回和退出 ) 。

8086 CPU有两个登记簿,即部分登记簿(SS)和SP登记簿(SP),最高部分地址保留在SS,抵消地址记录在SP。SS:SP指向栈顶元素。push指令和pop执行命令时, CPU 从 SS 和 SP 获得最高地址 。

push dx今后的步骤将完成执行工作。

  1. SS:SP=码头地址00:2000
  2. 数据宽度确定:DX登记数据为16位数,因此SP=SP-2=0X1FFE
  3. 删除上面的 DX 登记值。00000072 B280 mov dl,0x80DX的低注册 dl 已经编程 与指令。0x80和整个DX=0x0080
  4. 将 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

  1. CS CPU 读取时间: IP=00:7C95处的指令(int 0x13)到指令缓冲器。
  2. 更新CS:IP=00:7C97
  3. 执行指令int 0x13

内置命令以 Intn,n 形式写成,作为断开型代码,并启动中断过程。

如下所示,CPU执行与启动N干扰中断过程相似的内插指令:

  1. 从断开矢量数据库获取相关的断开程序条目地址(段落地址和抵消地址),使用断开类型 n。
  2. IF = 0,TF = 0, 签名登记录入;
    此时SS:SP=00:1FFE16位符号登记册,SP=SP-2=1FFC
    此时,在以下登记册上标注:FLAG=0x0044=0000 0000 0100 0100
    当我刚入行时,这里的顶部写着:0000:1FFD=0x000000:1FFC=0x44
  3. 16,SP=SP-2=CS Intrench 16,SP=SP-2=CS Intrench 16,SP=SP=SP-2=CS Intrench1FFC0000:1FFB=0x000000:1FFA=0x00
  4. 16 IP Intrench;SP=SP-2=1FF80000:1FF9=0x7C0000:1FF8=0x97
  5. (IP)=(n*4),IP计算=0000:004C内存单元有16位元值。
  6. (CS)=(n*4+2)和计算CS=0000:004E内存单元有16位元值。

当最后一步完成后, CPU 开始 。0x13(否)进程中断。

国旗登记国家管制标记:
状态控制标记用于规范CPU的操作,可使用特定指示更改。

  1. 当 TF 设为 1 时, CPU 进入一个单步执行模式, 即每个指令都执行, 导致一步骤中断请求。 这种方法主要用于进程调试 。
    注:虽然命令系统中没有用于改变标签 TF 值的特别命令,但程序员可以通过在按键进入标签页后更新输入值来改变TF打字位置值。
  2. 可中断的标志牌(IF)用于检测CPU是否响应CPU在CPU外可屏蔽断开的中断请求。当IF=1时,CPU 响应 CPU 外的可屏幕断开时的中断请求 。当IF=0时,CPU 不回应 CPU 外的屏蔽中断的中断请求 。
    注:尽管标记值很高,但CPU必须对在CPU之外发出的中断请求和CPU内部产生的中断请求作出反应。
  3. 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 和标签登记, 然后再返回主程序指令 。

  1. 离开商店后返回主程序 IP =0x7C97
  2. 走出谷仓,回到掌握 CS=0x0000
  3. 退出棚屋并重新启动主程序 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

  1. CS CPU 读取时间: IP=00:7C99处的指令(jc 0xd8)到指令缓冲器。
  2. 更新CS:IP=00:7C9B
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7C9B处的指令(cmp bx,0xaa55)到指令缓冲器。
  2. 更新CS:IP=00:7C9F
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7C9F处的指令(jnz 0xd8)到指令缓冲器。
  2. 更新CS:IP=00:7CA1
  3. 执行指令jnz 0xd8

现在的ZF牌位不等于零 所以..jnz 0xd8不进行跳转。

本指示应与上一项指示结合使用。jc 0xd8之后,再次对int 13H ah=41H订单中断的结果已经确认,BIOS对扩展号13的支持已经确认。

0xd8 的指令是CHS 位置模式,这意味着如果 LBA 位置模式不可用,则使用CHS。

000000A1 83E101 and cx,byte +0x1

  1. CS CPU 读取时间: IP=00:7CA1处的指令(and cx,byte +0x1)到指令缓冲器。
  2. 更新CS:IP=00:7CA4
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7CA4处的指令(jz 0xd8)到指令缓冲器。
  2. 更新CS:IP=00:7CA6
  3. 执行指令jz 0xd8

此时标志位ZF=0

所以不进行跳转

000000A6 31C0 xor ax,ax

  1. CS CPU 读取时间: IP=00:7C79处的指令(xor ax,ax)到指令缓冲器。
  2. 更新CS:IP=00:7C7B
  3. 执行指令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位位高

已知:

  1. DS:SI =00:7c05,它代表磁盘地址软件包的地址
  2. 磁盘地址内容(部分已知数据与 DS:SI 和磁盘地址软件包格式一同显示):
    1. 软件包尺寸( 小型块块)

      00:7c05H
      0x10
    2. 要发送的部门数量(某些BIOS上多达127个)

      00:7c08H 00:7c07H
      0x00 0x01
    3. 转移缓冲(16位数抵消:16位数)

      段h 段l 偏移地址h 偏移地址l
      00:7c0cH 00:7c0bH 00:7c0aH 00:7c09H
      0x70 0x00 0x00 0x00
    4. 低32位LBA,从48位开始

      00:7c10H 00:7c0fH 00:7c0eH 00:7c0dH
      0x00 0x00 0x00 0x01
    5. LBBA 开始于48位位高16位位高

      00:7c14H 00:7c13H 00:7c12H 00:7c11H
      0x00 0x00 0x00 0x00
  3. AH = 0x42
  4. dl = 0x80

在记忆地址读取80号驱动器的第一个扇区(512字节)。0x7000

应当指出,文件中提供的汇编代码是以记忆为基础的。0x7c00地址是不同的; 不要混淆或隐藏它 。

000000D1 7205 jc 0xd8

  1. CS CPU 读取时间: IP=00:7CD1处的指令(jc 0xd8)到指令缓冲器。
  2. 更新CS:IP=00:7CD3
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7CD3处的指令(mov bx,0x7000)到指令缓冲器。
  2. 更新CS:IP=00:7CD6
  3. 执行指令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

  1. CS CPU 读取时间: IP=00:7D55处的指令(xor si,si)到指令缓冲器。
  2. 更新CS:IP=00:7D57
  3. 执行指令xor si,si总是检索在逻辑上不同于或自行计算到的 AX 注册值。0x0,然后将数据传送到SI登记册。
  4. 国旗注册号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的操作,可使用特定指示更改。

  1. 当 TF 设为 1 时, CPU 进入一个单步执行模式, 即每个指令都执行, 导致一步骤中断请求。 这种方法主要用于进程调试 。
    注:虽然命令系统中没有用于改变标签 TF 值的特别命令,但程序员可以通过在按键进入标签页后更新输入值来改变TF打字位置值。
  2. 可中断的标志牌(IF)用于检测CPU是否响应CPU在CPU外可屏蔽断开的中断请求。当IF=1时,CPU 响应 CPU 外的可屏幕断开时的中断请求 。当IF=0时,CPU 不回应 CPU 外的屏蔽中断的中断请求 。
    注:尽管标记值很高,但CPU必须对在CPU之外发出的中断请求和CPU内部产生的中断请求作出反应。
  3. 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:007000:100% 1 和% 1 之间的内存数据已传送到% 1 。00:800000:8100之间。

0000015F 1F pop ds

恢复 DS 登记册的价值,并修复由该子代码造成的任何记忆腐败。

00000160 61 popaw

恢复共同登记值,并修复该子编码造成的内存值损害。

00000161 FF265A7C jmp word [0x7c5a]

这取决于磁盘的放置情况。[0x7c5a]的值是0x8000

所以它就像,从头开始..00:8000处的内核指令了。

在那之前,MBR飞行员已经过期了

通过绿色区块识别,由上述MCBR试点方案执行的命令

在这里插入图片描述

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息