Assembly 如何找到堆栈开始和结束的地址?
我需要使用assembly insert来获取堆栈的开始和结束地址。 据我所知,SP寄存器指向堆栈的开头,但如何找到结尾? 我说的是i386架构。 我意识到SP是堆栈的顶部,BP是堆栈的底部。 所以我可以用BP-SP计算尺寸 还有一个问题。堆栈大小是静态的吗?开始后它不会改变吗 据我所知,SP寄存器指向堆栈的开始 不。正如Jester所写,Assembly 如何找到堆栈开始和结束的地址?,assembly,x86,callstack,stack-size,Assembly,X86,Callstack,Stack Size,我需要使用assembly insert来获取堆栈的开始和结束地址。 据我所知,SP寄存器指向堆栈的开头,但如何找到结尾? 我说的是i386架构。 我意识到SP是堆栈的顶部,BP是堆栈的底部。 所以我可以用BP-SP计算尺寸 还有一个问题。堆栈大小是静态的吗?开始后它不会改变吗 据我所知,SP寄存器指向堆栈的开始 不。正如Jester所写,SP指向堆栈中“已使用”和“未使用”部分之间的“边界” 如果SP包含值0x1234,则未使用=0x1234的内存地址 我需要使用assembly insert
SP
指向堆栈中“已使用”和“未使用”部分之间的“边界”
如果SP
包含值0x1234,则未使用<0x1234的内存地址,并使用>=0x1234的内存地址
我需要使用assembly insert来获取堆栈的开始和结束地址
简单回答:
这是不可能的
也许操作系统提供了这样的功能——这取决于您使用的操作系统
更复杂的答案:
CPU需要知道堆栈的“已使用”和“未使用”部分之间的“边界”,以执行堆栈操作(push
,pop
,call
,ret
…)
因此,CPU具有堆栈指针寄存器(SP
),其中包含此“边框”的位置
这个“边界”的地址是CPU所需要的唯一信息;它不需要任何其他类型的信息,如堆栈的大小、开始或结束来执行任何类型的操作
由于不需要此信息,CPU没有包含此信息的任何寄存器或类似文件
因此,您无法使用assembly读取此信息。SP指向当前堆栈顶部。它可能是你想要的,也可能不是你想要的。另一端取决于您忘记指定的操作系统。您也没有提到architecture.BP是当前堆栈帧的底部(-ish),如果它已经设置好的话。它可能是你想要的,也可能不是你想要的。不清楚。你知道这些是16位寄存器名,对吗?ESP是32位堆栈指针。