【问题标题】:Did I correctly set up the stack segment in real mode?我是否在实模式下正确设置了堆栈段?
【发布时间】:2011-10-02 02:10:31
【问题描述】:

我正在编写一个引导加载程序,并这样设置我的堆栈...

STACK_SEGMENT equ 0x0050
STACKP_OFFSET equ 0x03FF

mov ax, STACK_SEGMENT
mov ss, ax
mov sp, STACKP_OFFSET

我这样做是否分配了 1024 字节的堆栈空间?是否适合在 0x00900 加载其他内容? 0x00900 应该在我的堆栈数据之后...

【问题讨论】:

    标签: assembly stack segment real-mode stack-size


    【解决方案1】:

    是的,这将为您提供 1024 字节的堆栈空间,只要您没有加载 0x500 和 0x900 之间的任何其他内容。此外,是的,在不覆盖堆栈的情况下将数据存储在 0x900 是安全的。要记住的一件事是,如果堆栈和数据段不同,如果您想使用除spbp 以外的任何寄存器访问堆栈上的数据,则需要使用段前缀。

    【讨论】:

    • 前缀是什么意思?
    • @TheFuzz 您添加一个段前缀以使数据从非默认段加载。您可以通过添加ss 前缀来使用堆栈段从bx 加载数据:mov ax,ss:[bx]
    • 为什么以及何时使用除bpsp 之外的寄存器来访问堆栈数据?对不起,我不太明白。
    • 如果您需要在函数之间传递一个指向局部变量的指针,该变量通常存储在堆栈中。但是,除非它期望,否则其他函数通常会假定它存储在数据段中。这可能是也可能不是您需要担心的事情,但您应该注意以防万一。
    猜你喜欢
    • 2015-09-25
    • 2017-10-20
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多