堆栈寄存器保存0x7c00的用途

问题描述 投票:0回答:1

我在理解代码的幕布部分、它是如何工作的以及操作堆栈寄存器背后的内容时遇到问题。

; that part i'm referring to
mov ss, ax
mov sp, 0x7c00 

我需要对该代码部分及其用途的解释,也许该信息将来自您要发送链接的文档或论坛等来源,如果我有错,您可以随时纠正我。

assembly x86 stack osdev bios
1个回答
0
投票
mov ss, ax
mov sp, 0x7c00

该代码来自我的回答:扇区 1 没有 BIOS 输出

org 0x7C00
bits 16

XOR  AX, AX
MOV  DS, AX
MOV  ES, AX
MOV  SS, AX
MOV  SP, 0x7C00

您询问的是设置 SS 和 SP 寄存器的线路的用途。
好吧,每个程序在某个时候都会使用堆栈

  • 这可能是因为您想要执行一个子例程,为此您将使用
    call
    指令将返回地址放入堆栈,并使用
    ret
    指令从堆栈中删除完全相同的返回地址。
  • 或者您可以选择保留一个或多个寄存器,然后堆栈将是一个方便的地方。
  • 或者您可能希望利用 BIOS 或 DOS api,为此您可以使用
    int
    指令,将 FLAGS 寄存器、CS 段寄存器和 IP 寄存器的副本放置在堆栈上。返回后,
    iret
    指令将恢复这些项目。

还有定时器、键盘等中断处理程序,它们可以自主运行,也需要正确设置堆栈。

所以你看栈是非常重要的。
但是为什么我要把 SS:SP 初始化为 0x0000:0x7C00?

当 BIOS 让引导加载程序控制机器时,功能堆栈就已经存在。遗憾的是,您不能指望它会驻留在一个不会干扰您计划在机器上执行的任何操作的位置。显而易见的解决方案是将堆栈自己放置在安全位置,而对于引导加载程序来说,最安全的位置本身位于线性地址 0x7C00 ,就在内存中它的下方。因此,堆栈指针 SP(代表堆栈内存的顶部)设置为 0x7C00,它提供了约 30000 字节的堆栈内存。即使对于最苛刻的引导加载程序来说,这也绰绰有余。

MOV  SS, AX
MOV  SP, 0x7C00

您应该始终按此特定顺序串联更改这些寄存器! x86 cpu 有一个特殊的安全机制,使得在写入 SS 段寄存器后中断无法执行。

pop ss
享有与
mov ss, r/m16
相同的保护。如果程序员随后使用此窗口将值分配给配套的 SP 寄存器,则不再存在格式错误的堆栈指针 SS:SP 的风险,这将是灾难性的事件。

© www.soinside.com 2019 - 2024. All rights reserved.