作者IdFormat (帳號式)
看板C_and_CPP
標題[問題] GCC行內組語的一些問題
時間Mon Apr 22 07:24:58 2013
開發平台(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
→ scwg:有可能是 -fstack-protector 04/22 12:20
→ jackace:直接objdump看他放了甚麼東西進去 04/22 13:34
→ IdFormat:看來是 fstack-protector 因為我開了-O2 04/22 13:50
→ IdFormat:fstack-protector說明上寫了空格八字節以防緩充溢出 04/22 13:51
→ descent:你應該關掉再測試看看是不是 -fstack-protector 04/22 14:04
→ IdFormat:剛測了 沒錯是fstack-protector 04/22 14:32
→ descent:IdFormat: 是 32bit 還是 64bit環境? epb 應該是 32 bit 04/22 14:42
→ descent:gcc 是那一版? 04/22 15:00