2011-12-10 64 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

我現在認識到,未對齊的局部變量並不奇怪,我只是從來沒有使用它們:)結論仍然成立。 –