Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何找到堆栈开始和结束的地址?_Assembly_X86_Callstack_Stack Size - Fatal编程技术网

Assembly 如何找到堆栈开始和结束的地址?

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

我需要使用assembly insert来获取堆栈的开始和结束地址。 据我所知,SP寄存器指向堆栈的开头,但如何找到结尾? 我说的是i386架构。 我意识到SP是堆栈的顶部,BP是堆栈的底部。 所以我可以用BP-SP计算尺寸

还有一个问题。堆栈大小是静态的吗?开始后它不会改变吗

据我所知,SP寄存器指向堆栈的开始

不。正如Jester所写,
SP
指向堆栈中“已使用”和“未使用”部分之间的“边界”

如果
SP
包含值0x1234,则未使用<0x1234的内存地址,并使用>=0x1234的内存地址

我需要使用assembly insert来获取堆栈的开始和结束地址

简单回答:

这是不可能的

也许操作系统提供了这样的功能——这取决于您使用的操作系统

更复杂的答案:

CPU需要知道堆栈的“已使用”和“未使用”部分之间的“边界”,以执行堆栈操作(
push
pop
call
ret
…)

因此,CPU具有堆栈指针寄存器(
SP
),其中包含此“边框”的位置

这个“边界”的地址是CPU所需要的唯一信息;它不需要任何其他类型的信息,如堆栈的大小、开始或结束来执行任何类型的操作

由于不需要此信息,CPU没有包含此信息的任何寄存器或类似文件


因此,您无法使用assembly读取此信息。

SP指向当前堆栈顶部。它可能是你想要的,也可能不是你想要的。另一端取决于您忘记指定的操作系统。您也没有提到architecture.BP是当前堆栈帧的底部(-ish),如果它已经设置好的话。它可能是你想要的,也可能不是你想要的。不清楚。你知道这些是16位寄存器名,对吗?ESP是32位堆栈指针。