为什么 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。
我尝试研究 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。