assembly - 如何在 x86 实模式引导加载程序中初始化堆栈以防止与 BIOS 冲突?

标签 assembly x86-16 bootloader callstack bios

假设我想将堆栈初始化为 S 的大小字节。

我想选择堆栈的基位置B以便随着堆栈从 B 向下增长,我最终不会覆盖引导加载程序或 BIOS 使用的任何代码或其他内存。

由于我自己编写引导加载程序(并且初始 MBR 扇区被加载到线性地址 0x7c00 ),防止与引导加载程序发生冲突似乎是一个仔细规划的问题。

我如何知道 BIOS 代码所在的位置,以及我的堆栈是否可能覆盖 BIOS 正在使用的任何内存?

另外,是否有任何关于初始ss:sp 的保证?正在指向,我可以在不设置新值的情况下安全使用多少堆栈空间?

最佳答案

通常,引导加载程序会将 ss:sp 设置为 00000h:07c00h:。我进行了网络搜索,显然当 BIOS 跳转到引导加载程序时 ss:sp 的设置取决于 BIOS。在 Microsoft MBR 的情况下,引导加载程序将 ss:sp 设置为 00000h:07c00h,并将其大部分代码传输到 00000h:00600h,并跳转到 00000h:006xxh。依次查看分区表以找到可引导扇区并重复该过程,加载并跳转到 00000h:07c00h。这可能会再重复一次。最终,引导过程将加载多个扇区并开始 Microsoft 操作系统的实际引导。我不知道 Linux 类型操作系统的顺序。

关于assembly - 如何在 x86 实模式引导加载程序中初始化堆栈以防止与 BIOS 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61296865/

相关文章:

c - while(i--) 通过 gcc 和 clang 优化 : why don't they use sub/jnc?

assembly - MASM 中的@data 指令是什么意思?

assembly - 有没有办法用 int 13h 读取放在 head = 1 上的内核?

assembly - 适用于 ubuntu 的 8086/88 模拟器

stm32 - 如何从用户闪存启动STM32?

bootloader - 使用GRUB2环回命令挂载VHD

c - 这些行汇编代码的目的是什么?

assembly - 关于非空 bin 文件的 NASM 问题

assembly - 如何使用 BIOS int 10h 更改 x86-16 程序集中的文本背景颜色

windows - 我怎样才能返回Windows 7和Windows XP和Linux的引导加载程序