[問題] GCC行內組語,有關EBP的內容
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
linux + gcc
是這樣的 我用了內聯組語
(當然要開 -fno-omit-frame-pointer免的他優化掉調用慣例)
函數是這樣
int Fun(volatile int a, volatile int b, volatile int c)
{
volatile int d, e, f;
/*開始寫些組語*/
asm("mov dword ptr [ebp + 8], 1\n"); /*a */
:
:
asm("mov dword ptr [ebp - 8 - 4], 5\n"); /*f */
:
printf("a = %d\n", a);
return 0;
}/*Fun*/
ebp沒有問題 是存放函數的返回地址
ebp + 4也沒問題 是存放舊的 ebp 值
(調用慣例會有push ebp再 mov ebp, esp)
再上去就是引數了
現在問題點就是 為何區域變量 不是從 ebp - sizeof(最後一個變量的型態)
開始?
而是為 ebp - 8 - sizeof(最後一個變量的型態)
(當然講最後一個變量的型態不太精確,
其實是要考慮變量對齊,才能決定那個區域變量是在堆棧中的最高位)
那請問 ebp - 1 到ebp - 8 中間存放的是什麼呢?
嘗試了好久還是不知道是什麼東西啊...像垃圾值又不像
網上爬文 好像說是預防緩充區溢出
( int a[60]; a[60] = 0xXXXXX, 怕這樣就洗到 ebp的值了)
看是有理 不過還是請大大解惑 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.80.167.102
→
04/22 12:20, , 1F
04/22 12:20, 1F
→
04/22 13:34, , 2F
04/22 13:34, 2F
→
04/22 13:50, , 3F
04/22 13:50, 3F
→
04/22 13:51, , 4F
04/22 13:51, 4F
→
04/22 14:04, , 5F
04/22 14:04, 5F
→
04/22 14:32, , 6F
04/22 14:32, 6F
→
04/22 14:42, , 7F
04/22 14:42, 7F
→
04/22 15:00, , 8F
04/22 15:00, 8F