2011-12-10 65 views
1

在HLA中,激活记录中存储的参数究竟如何?HLA中的激活记录

我已阅读过很多主题,但 问题是,当参数是“小于4字节”数据类型中的任何一种时。

例如:

Procedure proc(VAL i:int32; VAL j:int16; VAL k:int16);@nodisplay; 

(注意,所有参数是否VAL)

,因为它没有任何地方所提到的,所有的参数分配(至少)一个4字节的块, 我希望k在EBP + 8上,j在EBP + 10上,i在EBP + 12上。

但根据一些stdout.puts,情况并非如此。 (至少不在我的系统上) k在EBP + 8上,j在EBP + 12上,而我在EBP + 16上。

是否有任何资源指出,参数分配4字节的块? 或者是我的HLA行为异常?

回答

2

局部变量和参数存储在堆栈中,堆栈在32位模式下一次分配一个固定的32位。即使您的参数小于32位,它们仍然占用堆栈中的32位。

+0

是的,这是有道理的,除了局部变量不占用整个32位空间。考虑这个: ** VAR x:int32; Y:INT8; z:int16; ** 在这种情况下,x在EBP + 4上,y在EBP + 5上,z在ebp + 7上。通过将ESP指向EBP + 8,32位完整性仍然存在。 总之,似乎**整个变量部分**占用了内存中4个字节的倍数。另一方面,参数占用每个参数**的4个字节**的倍数。 _(抱歉,很难在评论中正确格式化)_ – JaySicks

+0

我没有得到这些变量的布局,但如果确实可以声明byteborder局部变量,那么这是对HLA的好奇心。如果他们决定不包含相同的参数功能,则可能是因为如果每个双字多于一个,调用者就很难将参数放在堆栈上。 –

+0

我现在认识到,未对齐的局部变量并不奇怪,我只是从来没有使用它们:)结论仍然成立。 –