嗨,我正在阅读弗吉尼亚大学关于 x86 的指南,它指出推送和弹出堆栈会删除或向堆栈添加 4 字节数据元素。
为什么设置为 4 个字节?这可以改变吗,你可以通过推送更小的数据元素来节省堆栈上的内存吗?
如果有人想查看该指南,可以在这里找到: http ://www.cs.virginia.edu/~evans/cs216/guides/x86.html
嗨,我正在阅读弗吉尼亚大学关于 x86 的指南,它指出推送和弹出堆栈会删除或向堆栈添加 4 字节数据元素。
为什么设置为 4 个字节?这可以改变吗,你可以通过推送更小的数据元素来节省堆栈上的内存吗?
如果有人想查看该指南,可以在这里找到: http ://www.cs.virginia.edu/~evans/cs216/guides/x86.html
简短回答:是的,16 位或 32 位。并且,对于x86-64,64 位。
堆栈的主要原因是从嵌套函数调用返回并保存/恢复寄存器值。它也通常用于传递参数和返回函数结果。除了最小的参数外,这些项在处理器设计上通常具有相同的大小,即指令指针寄存器的大小。对于 8088/8086,它是 16 位。对于 80386 和后续版本,它是 32 位的。因此,在其他大小上操作的堆栈指令几乎没有价值。
还有内存总线上数据大小的考虑。检索或存储一个字所花费的时间与处理一个字节所花费的时间相同。(除了 8088,它有 16 位寄存器,但有 8 位数据总线。)对齐也起作用。堆栈应在字边界上对齐,以便每个值都可以作为一个内存操作检索。权衡通常是为了节省时间而不是节省内存。要将一个字节作为参数传递,通常使用一个字。(或者,根据编译器可用的优化,将使用一个字大小的寄存器,完全避免堆栈。)