为啥 MBR 将自身复制到“0x0600”?
Posted
技术标签:
【中文标题】为啥 MBR 将自身复制到“0x0600”?【英文标题】:Why MBR copies itself to "0x0600"?为什么 MBR 将自身复制到“0x0600”? 【发布时间】:2021-12-22 23:19:34 【问题描述】:我曾尝试研究 X86 MBR 代码如下:
0000:7C00 FA CLI
0000:7C01 33C0 XOR AX,AX
0000:7C03 8ED0 MOV SS,AX
0000:7C05 BC007C MOV SP,7C00
0000:7C08 8BF4 MOV SI,SP
0000:7C0A 50 PUSH AX
0000:7C0B 07 POP ES
0000:7C0C 50 PUSH AX
0000:7C0D 1F POP DS
0000:7C0E FB STI
0000:7C0F FC CLD
0000:7C10 BF0006 MOV DI,0600
代码最后一行的原因我看不懂。
【问题讨论】:
【参考方案1】:因为 boot0 被 Bios 加载到地址 0x7C00,它会将自身复制到地址 0x600,然后将控制权转移到那里。
有关更多信息,请参阅this manual,它包含您需要的所有详细信息。实际上,这是因为引导段加载在一个固定地址,因此如果您需要从先前链接的引导段中调用某些内容,则必须将其存储在其他位置。
选择的地址是一个“合理”的地址,可以最大限度地减少当前内存的碎片并允许您拥有一个堆栈:此阶段可用的低内存范围从 0x500 到 0x7ff 并且您必须拾取低于标准的位置入口点位于 0x7c0。随着堆栈向下增长,选择 0x600 作为重定位地址将为堆栈提供 0x100 字节,并允许您将其余内存用于其他目的。详情请见here。
【讨论】:
感谢您的解释,但我不明白为什么 MBR 将自身复制到“0x0600”。在您分享的上述链接中,解释启动过程中的步骤,但找不到复制到 0X0600 的原因。 嗨,我已经改进了答案。现在有用吗? 是的,这很有帮助。非常感谢。以上是关于为啥 MBR 将自身复制到“0x0600”?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 [1,2,3] 在 Javascript 中不等于自身? [复制]
我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身? [复制]