一段时间前(2-3年前),在我的大学里,我们正在编写MC68HC11微控制器的程序,我们的讲师告诉我们,堆栈是内存的一部分,它具有以下功能:
我从来不知道如何才能过渡到一个子程序。实际上,我知道有PC (程序计数器),它从当前正在执行的程序中指向当前字节,即指向到达执行程序的位置。有人能举个例子吗?堆栈什么时候会拉,什么时候会弹出一些东西(可能是JMP在代码上面,但我不认为它会起作用)。堆栈拉动和pops是否自动执行(不包括程序员的需要)?我是否需要在内存中编写两个程序,然后从另一个调用其中一个来执行自动堆栈拉出?
现在不必要:
实际上,我正在尝试理解程序集堆栈,因为我希望与C和C++堆栈以及堆进行比较,并能够掌握所谓的“堆栈跟踪调试”,但这将出现在下一个线程中,即现在。
发布于 2015-12-04 23:06:24
在x86中:
push rax减少堆栈指针,然后将值存储在堆栈指针现在指向的位置。pop rax做的正好相反:相当于mov rax, [rsp] / add rsp, 8。调用推送以下指令的地址,然后跳转到目标。如果您对x86有更多的兴趣,请参阅x86标记wiki中的链接。
堆栈指针开始指向分配给用作堆栈的内存块的顶部。见堆栈。关于计算机如何使用“该”堆栈(相对于自定义堆栈数据结构)的介绍,可能有更好的链接,但这个链接看起来还可以。
发布于 2015-12-04 22:07:14
call和中断将PC推到堆栈中,ret和iret pop PC再次在普通CPU上自动返回。仅此而已。
https://stackoverflow.com/questions/34098005
复制相似问题