Assembly 我是否正确设置了实模式下的堆栈段?

Assembly 我是否正确设置了实模式下的堆栈段?,assembly,stack,segment,real-mode,stack-size,Assembly,Stack,Segment,Real Mode,Stack Size,我正在写一个引导加载程序,我把我的堆栈设置成这样 STACK_SEGMENT equ 0x0050 STACKP_OFFSET equ 0x03FF mov ax, STACK_SEGMENT mov ss, ax mov sp, STACKP_OFFSET 我这样做是在分配1024字节的堆栈空间吗?是否适合在0x00900加载其他内容?0x00900应该在我的堆栈数据之后…是的,这将为您提供1024字节的堆栈空间,只要您没有加载0x500和0x900之间的任何其他内容。此外,是的,在不覆盖

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

STACK_SEGMENT equ 0x0050
STACKP_OFFSET equ 0x03FF

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

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

是的,这将为您提供1024字节的堆栈空间,只要您没有加载0x500和0x900之间的任何其他内容。此外,是的,在不覆盖堆栈的情况下,将数据存储在0x900是安全的。需要记住的一点是,如果堆栈和数据段不同,那么如果要使用
sp
bp

以外的任何寄存器访问堆栈上的数据,则需要使用段前缀。前缀是什么意思?@TheFuzz您添加了段前缀,以便从默认段以外的段加载数据。您可以使用堆栈段从
bx
加载数据,方法是添加
ss
前缀:
mov ax,ss:[bx]
。为什么以及何时使用
bp
sp
以外的寄存器访问堆栈数据?抱歉,我不太明白。如果需要在函数之间传递指向局部变量的指针,该变量通常存储在堆栈上。但是,除非它期望这样,否则另一个函数通常会假定它存储在数据段中。这可能是也可能不是你需要担心的事情,但你应该意识到这一点以防万一。