假设使用x86调用约定

时间:2018-11-14 00:00:28

标签: assembly x86

int fun (short a,long b, int c){short q; char s[3]; int y; }

我的堆栈框架如下:(我不确定)

enter image description here

两个问题:

  1. 好吗?
  2. 在这个约定中,堆栈的地址增加了,而堆的地址减少了吗?

1 个答案:

答案 0 :(得分:1)

没有一个x86调用约定,并且调用约定也没有定义局部变量的布局。
因此,即使在考虑如何实现C类型之前,也无法正确地构造问题。

如果我们假设:

  • stdcallcdecl调用约定。
  • 编译器正在使用帧指针。
  • 编译器将至少在其自然边界上对齐数据。
  • shortintlong分别为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个。

abc以相反的顺序被压入堆栈,所有类型必须占用4的倍数的字节数。

本地分配不是绝对的,它取决于周围的代码(非易失性寄存器,调用,临时对象,堆栈保护的使用等),在这种情况下,根本没有代码或上下文,问题是有点空虚。
仅使用最后两个假设 1 ,我们可以将q放在[EBP -02h]上,因为q是2个字节,并且必须是2的地址倍数; s位于[EBP -05h],因为它是3个字节,并且是字节对齐的;最后,从仅大小的角度来看,y 可能会在[EBP -09h]出现,但由于必须对齐4字节,因此它会出现在[EBP -0ch]处。
请注意,以上所有推理都利用EBP对齐4字节这一事实。


1 我们还假定本地人以相反的顺序布置:声明顺序的最后一个在较低的地址布置。