装配堆栈基础知识

时间:2013-10-20 03:24:37

标签: assembly x86 stack cpu-registers segments

因此,在我进入大会的过程中,我对这个实模式二进制文件中的一件事情“不知道”。

这是从9FB00-> 90000准备堆栈。我遵循的指南假设我对段有所了解,我希望能得到关于9000-> 90000的解释。

 [BITS 16]
 [ORG 0x7C00]

 jmp 0x0:Start

 Start:
 cli
 ;<<<ZONE IN QUESTION>>>
 mov AX,0x9000
 mov SS,AX
 ;<<<ZONE IN QUESTION>>>
 mov SP,0xFB00
 sti

 cli
 hlt

 times 510 - ($ - $$) db 0 ;nasmgasm
 dw 0xAA55

1 个答案:

答案 0 :(得分:1)

实模式下的x86寄存器包括正常的处理器寄存器集和一组额外的段寄存器,所有这些寄存器都是16位长。为了将地址空间扩展到64kb以上,段寄存器与其他地址寄存器相差4位,最终地址通过将地址寄存器(在您的情况下为堆栈指针)添加到段寄存器(SS为您的问题)来计算< / p>

因此你得到:

SS = 9000    ; offset 4 bits
SP =  FB00
     =====
     9FB00  ; Final address in actual memory space.

一旦您离开实模式,32位寄存器可用,这将大大扩展。