Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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_Stack - Fatal编程技术网

Assembly 为什么我们必须清理烟囱

Assembly 为什么我们必须清理烟囱,assembly,stack,Assembly,Stack,我正在上汇编课,我们正在学习堆栈。据我所知,所有被推入堆栈的内容最终都必须弹出(清理堆栈)。为什么我们绝对需要清理烟囱?我读过它是为了防止内存泄漏,是吗 非常感谢堆栈是一个有限的内存量,与任何内存分配系统一样,如果您不清理它,它只会不断增长。最终,当您覆盖内存的其他区域或只是生成一个无效地址时,堆栈将溢出,所有的地狱都会散开。堆栈是一个有限的内存量,与任何内存分配系统一样,如果您从不清理它,它将不断增长。最终,当您覆盖内存的其他区域或只是生成一个无效的地址时,堆栈将溢出,所有的地狱都将消失。对于

我正在上汇编课,我们正在学习堆栈。据我所知,所有被推入堆栈的内容最终都必须弹出(清理堆栈)。为什么我们绝对需要清理烟囱?我读过它是为了防止内存泄漏,是吗


非常感谢

堆栈是一个有限的内存量,与任何内存分配系统一样,如果您不清理它,它只会不断增长。最终,当您覆盖内存的其他区域或只是生成一个无效地址时,堆栈将溢出,所有的地狱都会散开。

堆栈是一个有限的内存量,与任何内存分配系统一样,如果您从不清理它,它将不断增长。最终,当您覆盖内存的其他区域或只是生成一个无效的地址时,堆栈将溢出,所有的地狱都将消失。

对于给定的执行线程,只有一定数量的堆栈

它的目的是在调用函数时临时保存所需的数据(例如返回地址和传递给函数的参数)

如果在函数退出时不清理堆栈,最终将耗尽堆栈空间


此外,作为一条超越堆栈的一般规则,程序使用的任何资源(堆栈空间、堆空间、文件句柄等)都应保持尽可能短的时间,以提高总体效率。

对于给定的执行线程,只有一定数量的堆栈

它的目的是在调用函数时临时保存所需的数据(例如返回地址和传递给函数的参数)

如果在函数退出时不清理堆栈,最终将耗尽堆栈空间


此外,作为一个超越堆栈的一般规则,您的程序使用的任何资源(堆栈空间、堆空间、文件句柄等)都应保持尽可能短的时间,以提高总体效率。

如果不清理堆栈,调用函数将如何查找其变量?被调用者将运行,在堆栈上使用自己的变量执行一些操作,然后返回调用者-现在,如果堆栈指针已更改,调用者可以做什么?它如何恢复它来找出它自己的堆栈变量在哪里?唯一的解决办法是清理堆栈——不管是谁(被调用者还是调用者),但必须有人来清理


术语“内存泄漏”通常指丢失指向动态内存分配的指针,因此无法
释放该分配。

如果不清理堆栈,调用函数将如何找到其变量?被调用者将运行,在堆栈上使用自己的变量执行一些操作,然后返回调用者-现在,如果堆栈指针已更改,调用者可以做什么?它如何恢复它来找出它自己的堆栈变量在哪里?唯一的解决办法是清理堆栈——不管是谁(被调用者还是调用者),但必须有人来清理


术语“内存泄漏”通常指的是丢失指向动态内存分配的指针,因此无法
释放(
)该分配。

除了其他答案之外,我使用的大多数处理器都将函数调用的返回地址放在堆栈上

RET/RTS(或任何用于处理器的返回语法)只是从堆栈中提取返回地址,并将PC ProgramCounter设置为该地址

如果函数在堆栈上添加了其他变量,但没有删除它们,那么RET将回调错误的值,并返回到错误的地址,从而导致各种异常行为和/或异常/陷阱


这种行为导致的故障可能变得非常难以调试,特别是如果它们没有立即出现故障的话。除了其他答案之外,我使用的大多数处理器都会将函数调用的返回地址放在堆栈上

RET/RTS(或任何用于处理器的返回语法)只是从堆栈中提取返回地址,并将PC ProgramCounter设置为该地址

如果函数在堆栈上添加了其他变量,但没有删除它们,那么RET将回调错误的值,并返回到错误的地址,从而导致各种异常行为和/或异常/陷阱

这种行为导致的故障可能很难调试,特别是如果它们没有立即出现故障的话。软件例程(函数)可以共享堆栈以获取调用参数和返回变量,并记住调用方的返回地址

由于汇编中的堆栈指针通常是一个寄存器,因此它是一种全局变量。如果在函数末尾,堆栈指针未设置到正确的位置(“堆栈清理”),则可能会发生很多不好的事情。系统可能返回到错误的地址,调用方可能弹出错误的返回值,可能存在堆栈溢出、下溢等。

软件例程(函数)可以共享堆栈以获取调用参数和返回变量,并记住调用方的返回地址


由于汇编中的堆栈指针通常是一个寄存器,因此它是一种全局变量。如果在函数末尾,堆栈指针未设置到正确的位置(“堆栈清理”),则可能会发生很多不好的事情。系统可能返回到错误的地址,调用者可能弹出错误的返回值,可能存在堆栈溢出、下溢等。

每个函数都可能使用堆栈,即使有些函数不使用堆栈,也会在程序中嵌套函数调用一()调用二()二调用三(),等等

如果函数1在堆栈上有局部变量A,B,C,那么它调用了2,2在堆栈上使用了两个变量E和F。然后三个在堆栈上有G和H。如果不将堆栈指针还原到