在c中堆叠汇编与堆栈?

时间:2013-08-12 09:20:50

标签: c assembly

我一直想知道C中的堆栈和RISC或ARM等处理器的汇编程序堆栈之间的区别是什么?

Proffesor说,要谨慎,堆栈不同于你在其他主题上学到的堆栈(算法和结构,我们在那里学习C)

据我所知,两者都只是保存在内存中的数据,两者都在LastInFirstOut方案上运行,两者都需要在使用后进行清理。

我的意思是,他们不能相同,因为他们处于两个不同的“世界”中,但我错过了一些重要的东西吗?也许就是这样,但从那时起它一直困扰着我。

谢谢

3 个答案:

答案 0 :(得分:9)

堆栈完全相同。可以编写一个程序混合程序集/ C,它们使用相同的堆栈。

C编译器使用一些关于如何使用堆栈的约定:在每个函数入口处填充格式良好的堆栈帧;并在功能离开时清理。有一些特定于改变堆栈管理的编译器指令。例如:gcc stack checking

网络上的一些参考文献:google : c stack frame

在Assembly中,堆栈必须完全由程序员管理。最好有关于如何管理堆栈的规则(例如模仿C规则)

堆栈管理指令也非常依赖于处理器(x86上的pushpop,或ARM上的stmia / ldmfd等指令。同样,某些处理器也专用寄存器用于堆栈指针(x86上为esp),对于其他一些寄存器,它只是传统的(在ARM7上为r13。)

学习堆栈管理的一个好方法是使用调试器并进行一些回溯以查看帧内容。

为了更好地理解汇编级别的x86堆栈,我建议this Wikipedia articlethis one for stack frames

答案 1 :(得分:2)

我见过编译器使用overlay模型而不是堆栈模型作为自动变量。虽然语言将自动变量的分配和释放表示为堆栈,但底层实现不一定如此。

在某些编译器上,C堆栈存在,但与硬件堆栈是分开的。

然后有像register-windows这样的概念。

这个名单还在继续,但我不能保证这些都是你教授的想法,甚至是我走在正确的轨道上。只有一个人能够可靠地回答这个问题。

这些变体大多在概念上与堆栈一致,但如果您使用这两种语言,则需要注意实现细节。

答案 2 :(得分:1)

概念堆栈与x86堆栈(可能还有其他架构)的不同之处在于堆栈增长的方向。通常情况下,当堆栈(取决于架构)在内存中实际增长 down 时,将堆栈视为“向上”增长。