前一段时间(2 - 3年),在我的大学,我们编写了MC68HC11微控制器,我们的讲师向我们描述了堆栈是具有这些功能的内存的一部分:
我从未理解如何过渡到子程序。实际上我知道有PC(程序计数器)指向当前执行程序的当前字节,即指向程序执行的位置。有人可以在堆栈拉动时给出示例,什么时候会弹出一些东西(也许JMP高于代码,但我不认为它会这样做)。是否自动执行堆栈拉取和弹出(不包括程序员需要)?我是否需要在内存中编写两个程序,然后从另一个程序中调用一个程序来执行自动堆栈拉动?
现在不必要地:
我实际上是在尝试理解汇编堆栈,因为我想与C和C ++堆栈以及堆进行比较,并能够掌握所谓的“堆栈跟踪调试”,但这将在下一个线程中,即现在。
答案 0 :(得分:2)
call
并且中断将PC推入堆栈,ret
和iret
在公共CPU上自动弹回PC。多数民众赞成。
答案 1 :(得分:1)
在x86中:
push rax
递减堆栈指针,然后将值存储在堆栈指针现在指向的位置。
pop rax
反之亦然:相当于mov rax, [rsp]
/ add rsp, 8
。
调用按下以下指令的地址,然后跳转到目标。如果您对x86更加详细,请参阅x86标记wiki中的链接。
堆栈指针开始指向分配用作堆栈的内存块的顶部。见https://en.wikipedia.org/wiki/Call_stack。可能有更好的链接来介绍计算机如何使用“堆栈”(而不是自定义堆栈数据结构),但是看起来没问题。