我发现程序员通常会在他们的第一行引导加载器上注册(有时甚至是段),他们建议通常有这样的习惯。例如:
inc cx
dec bx
inc bp
dec di
xor ax, ax我所知道的是:BIOS在引导过程中清除所有寄存器!
在引导加载器中初始化寄存器和段是一个好习惯吗?为什么?默认寄存器、段和指针值(可能与芯片组有关)是什么?
发布于 2017-04-13 16:39:32
由于您提到了段寄存器的设置,并且您的代码似乎是16位代码,所以我假设您正在讨论的是遗留的IBM引导程序(PC),而不是(EFI/UEFI)。对于大多数已经制造的设备,在遗留引导加载器中,您几乎没有什么可以设想的。
当PC-BIOS从可用的引导设备加载引导扇区并向其传输控制时,所有寄存器的状态都有一个可用值。除了来自80年代和90年代的一些非标准(而不是100%兼容的BIOSes)之外,寄存器DL将包含引导驱动器号,BIOS是从它启动的。这个值也是用来调用Int 13h磁盘服务例程的值。
SS:SP可能指向RAM中的某个位置,但与BIOS和BIOS不同。应该设置自己的堆栈指针(SS和SP),特别是当您打算将数据加载到内存中时。除非您自己专门设置堆栈,否则您可以无意地用数据覆盖堆栈。
有些人认为,当控制被转移到引导加载程序(通常通过一个远JMP)时,CS:IP总是设置为0x0000:0x7c00 (CS=0x0000,IP=0x7c00)。不幸的是,这并不能保证。一些引导加载程序使用0x07c0:0x0000,这也指向物理地址0x07c00 (0x07c0<<4+0x0000)。这是因为不同的部分:偏移地址可以表示相同的物理地址(比如0x07c00)。我编写了一个Stackoverflow问答,它捕获了一种假设CS总是0x0000可能导致一些有趣的bug的情况,这取决于环境。
用于字符串指令(如中医和莫夫)的方向标志(标志寄存器中的DF)不应假定为特定方向。大多数代码使用前向移动(DF=0),但在跳转到引导加载程序之前,不能保证这是BIOS将其设置为的方向。因此,应该使用http://www.felixcloutier.com/x86/CLD.html显式清除前向移动,或者用http://www.felixcloutier.com/x86/STD.html将其设置为向后移动。
除了前面提到的DL寄存器,您不应该假定任何通用寄存器都是初始化的。我经常看到引导程序假定它们是零。几乎从来都不是这样的。
在我的Stackoverflow 通用引导加载器提示中讨论了许多这些事情。
https://stackoverflow.com/questions/43359327
复制相似问题