首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引导x86机器上的默认寄存器和段值

引导x86机器上的默认寄存器和段值
EN

Stack Overflow用户
提问于 2017-04-12 02:41:46
回答 1查看 2.5K关注 0票数 6

我发现程序员通常会在他们的第一行引导加载器上注册(有时甚至是段),他们建议通常有这样的习惯。例如:

代码语言:javascript
复制
inc cx
dec bx
inc bp
dec di
xor ax, ax

我所知道的是:BIOS在引导过程中清除所有寄存器

在引导加载器中初始化寄存器和段是一个好习惯吗?为什么?默认寄存器、段和指针值(可能与芯片组有关)是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 通用引导加载器提示中讨论了许多这些事情。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43359327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档