我目前正在使用“Linux中的汇编语言指南”学习x86程序集,并且在第241页上写道,只有16位字或32位字保存在堆栈中,但这是真的吗? 我的意思是在C中,一个char数组由单个字节组成,并且那些被保存到堆栈中,因为C由使用调用堆栈的函数组成,对吧?我错了什么?
答案 0 :(得分:5)
偶数字节用零填充,并在被推送之前转换为16位或32位字。
将堆叠视为特定尺寸(16或32)的堆板。有没有办法可以推出一半大小的盘子..不是吗?即使你想要推动尺寸的一半,你也可以用它来制作全尺寸的印版然后推它。
答案 1 :(得分:2)
push
指令是正确的,但这不是使用堆栈的唯一方法。 x86还有esp寄存器来存储指向当前堆栈位置的指针。
函数参数在堆栈上,如果你检查一些反汇编,你会看到编译器如何在那里得到它们。在x86的通常调用约定中,char
参数每个占用4个字节。数组不能通过值传递,因此如果char数组可以保存,则不会出现问题。
自动变量也占用堆栈,但数组元素不会使用“push”单独保存到堆栈中。通常,函数会在开始时为其所有自动变量腾出空间 - 查找涉及“esp”的“子”指令。然后,数组的起始位于esp的已知偏移处,就像任何自动变量一样,编译器将使用此偏移量来生成对数组的访问。元素之间不需要填充,尽管在数组结束后可能会有一些填充,以保持堆栈指针正确对齐。