【问题标题】:Activation record in HLAHLA中的激活记录
【发布时间】:2012-01-17 13:33:35
【问题描述】:

在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 上,i 在 EBP+16 上。

是否有任何资源指出,参数分配 4 字节块? 还是我的 HLA 行为不端?

【问题讨论】:

    标签: assembly record activation


    【解决方案1】:

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

    【讨论】:

    • 是的,这是有道理的,除了局部变量不占用整个 32 位空间。考虑一下:VAR x:int32; y:int8; z:int16; 在这种情况下,x 在 EBP+4 上,y 在 EBP+5 上,z 在 ebp+7 上。通过将 ESP 指向 EBP+8,32 位完整性仍然存在。简而言之,似乎 整个变量部分 占据了内存中 4 个字节的倍数。另一方面,参数每个参数占用 4 个字节的倍数。 (抱歉,在 cmets 中很难正确格式化)
    • 我没有得到这些变量的布局,但如果你可以声明 byteborder 局部变量是真的,那就是 HLA 的好奇心。如果他们决定不为参数包含相同的功能,可能是因为如果每个 dword 有多个参数,调用者将很难将参数放入堆栈。
    • 我现在意识到未对齐的局部变量并不奇怪,我只是从不使用它们:) 结论仍然成立。
    猜你喜欢
    • 2017-05-27
    • 2011-07-14
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2011-06-17
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多