启动 x86 机器时的默认寄存器和段值
Default registers and segments value on booting x86 machine
我发现程序员通常会在他们的引导加载程序的第一行修复寄存器(有时是段),他们通常建议养成这个习惯。例如:
inc cx
dec bx
inc bp
dec di
xor ax, ax
我所知道的是:BIOS 在引导过程中清除所有寄存器!
在引导加载程序中初始化寄存器和段是个好习惯吗?为什么?默认寄存器、段和指针值是多少(可能取决于芯片组)?
由于您提到了段寄存器的设置并且您的代码似乎是 16 位代码,我假设您正在讨论遗留的 IBM-PC 引导加载程序 (PC-BIOS) 而不是 (EFI/UEFI)。在已制造的大多数设备的遗留引导加载程序中,您可以假设的很少。
当 PC-BIOS 从可用的引导设备加载引导扇区并将控制权转移给它时,所有寄存器的状态只有一个具有可用值。除了 80 年代和 90 年代的一些非标准(并且不是 100% 兼容的 BIOS)之外,寄存器 DL 将包含 BIOS 启动的启动驱动器号。这个值也是用来调用 Int 13h disk service routines.
SS:SP 可能指向 RAM 中的某处,但不同 BIOS 的位置不同。应该设置自己的堆栈指针(SS 和 SP),尤其是当您打算将数据加载到内存中时。除非您自己专门设置,否则您可能会无意中用数据覆盖堆栈。
有人认为,当控制权转移到您的引导加载程序(通常通过一个FAR JMP)。不幸的是,这不能保证。一些引导加载程序已知使用 0x07c0:0x0000,它也指向物理地址 0x07c00 (0x07c0<<4+0x0000)。这是因为捕获假设 CS 始终为 0x0000 的情况的不同 segment:offset addressing can represent the same physical address (like 0x07c00). I wrote a 可能会导致一些有趣的错误,具体取决于环境。
用于字符串指令的方向标志(FLAGS 寄存器中的 DF)(如 CMPS and MOVS) should not be assumed to be a particular direction. Most code uses forward movement (DF=0) but there is no guarantee that is the direction the BIOS set it to before jumping to the bootloader. Because of that one should explicitly clear it with CLD for forward movement or set it with STD 用于向后移动。
除了前面提到的 DL 寄存器之外,你不应该假设任何通用寄存器都被初始化了。我经常看到引导加载程序假定它们为零。几乎从来没有这种情况。
我的 Whosebug .
中讨论了其中的许多内容
我发现程序员通常会在他们的引导加载程序的第一行修复寄存器(有时是段),他们通常建议养成这个习惯。例如:
inc cx
dec bx
inc bp
dec di
xor ax, ax
我所知道的是:BIOS 在引导过程中清除所有寄存器!
在引导加载程序中初始化寄存器和段是个好习惯吗?为什么?默认寄存器、段和指针值是多少(可能取决于芯片组)?
由于您提到了段寄存器的设置并且您的代码似乎是 16 位代码,我假设您正在讨论遗留的 IBM-PC 引导加载程序 (PC-BIOS) 而不是 (EFI/UEFI)。在已制造的大多数设备的遗留引导加载程序中,您可以假设的很少。
当 PC-BIOS 从可用的引导设备加载引导扇区并将控制权转移给它时,所有寄存器的状态只有一个具有可用值。除了 80 年代和 90 年代的一些非标准(并且不是 100% 兼容的 BIOS)之外,寄存器 DL 将包含 BIOS 启动的启动驱动器号。这个值也是用来调用 Int 13h disk service routines.
SS:SP 可能指向 RAM 中的某处,但不同 BIOS 的位置不同。应该设置自己的堆栈指针(SS 和 SP),尤其是当您打算将数据加载到内存中时。除非您自己专门设置,否则您可能会无意中用数据覆盖堆栈。
有人认为,当控制权转移到您的引导加载程序(通常通过一个FAR JMP)。不幸的是,这不能保证。一些引导加载程序已知使用 0x07c0:0x0000,它也指向物理地址 0x07c00 (0x07c0<<4+0x0000)。这是因为捕获假设 CS 始终为 0x0000 的情况的不同 segment:offset addressing can represent the same physical address (like 0x07c00). I wrote a
用于字符串指令的方向标志(FLAGS 寄存器中的 DF)(如 CMPS and MOVS) should not be assumed to be a particular direction. Most code uses forward movement (DF=0) but there is no guarantee that is the direction the BIOS set it to before jumping to the bootloader. Because of that one should explicitly clear it with CLD for forward movement or set it with STD 用于向后移动。
除了前面提到的 DL 寄存器之外,你不应该假设任何通用寄存器都被初始化了。我经常看到引导加载程序假定它们为零。几乎从来没有这种情况。
我的 Whosebug