为什么 MBR 将自身复制到“0x0600”?

Why MBR copies itself to "0x0600"?

我尝试研究 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         

我看不懂最后一行代码的原因

Because boot0 is loaded by the BIOS to address 0x7C00, it copies itself to address 0x600 and then transfers control there.

有关详细信息,请参阅 this manual,其中包含您需要的所有详细信息。实际上,这是因为引导段是在固定地址加载的,因此如果您需要从之前的链式引导段调用某些内容,则必须将其存储在其他地方。

选择的地址是一个“合理”的地址,可以最大限度地减少当前内存的碎片并允许您拥有一个堆栈:此阶段可用的低内存范围从 0x500 到 0x7ff,您必须在下面选择一个位置标准入口点位于 0x7c0。随着堆栈向下增长,选择 0x600 作为重定位地址将为堆栈提供 0x100 字节,并允许您将剩余的内存用于其他目的。有关详细信息,请参阅 here