int fun (short a,long b, int c){short q; char s[3]; int y; }
我的堆栈框架如下:(我不确定)
两个问题:
答案 0 :(得分:1)
没有一个x86调用约定,并且调用约定也没有定义局部变量的布局。
因此,即使在考虑如何实现C类型之前,也无法正确地构造问题。
如果我们假设:
stdcall
或cdecl
调用约定。short
,int
,long
分别为16、32、32位,分别对齐为2、4和4个字节。然后,我期望这个堆栈(请注意,我使用十六进制表示法):
[EBP +10h] c
[EBP +0Ch] b
[EBP +08h] a
[EBP +04h] Return address
[EBP +00h] Old EBP
[EBP -02h] q
[EBP -05h] s
[EBP -0ch] y
Clang does without optimisations就是那样,除了它保留3个寄存器,从而将偏移量向下移动了12个。
a
,b
和c
以相反的顺序被压入堆栈,所有类型必须占用4的倍数的字节数。
本地分配不是绝对的,它取决于周围的代码(非易失性寄存器,调用,临时对象,堆栈保护的使用等),在这种情况下,根本没有代码或上下文,问题是有点空虚。
仅使用最后两个假设 1 ,我们可以将q
放在[EBP -02h]
上,因为q
是2个字节,并且必须是2的地址倍数; s
位于[EBP -05h]
,因为它是3个字节,并且是字节对齐的;最后,从仅大小的角度来看,y
可能会在[EBP -09h]
出现,但由于必须对齐4字节,因此它会出现在[EBP -0ch]
处。
请注意,以上所有推理都利用EBP
对齐4字节这一事实。
1 我们还假定本地人以相反的顺序布置:声明顺序的最后一个在较低的地址布置。