[問題] GCC行內組語,有關EBP的內容

看板C_and_CPP作者 (帳號式)時間11年前 (2013/04/22 07:25), 編輯推噓0(008)
留言8則, 4人參與, 最新討論串1/1
開發平台(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
有可能是 -fstack-protector
04/22 12:20, 1F

04/22 13:34, , 2F
直接objdump看他放了甚麼東西進去
04/22 13:34, 2F

04/22 13:50, , 3F
看來是 fstack-protector 因為我開了-O2
04/22 13:50, 3F

04/22 13:51, , 4F
fstack-protector說明上寫了空格八字節以防緩充溢出
04/22 13:51, 4F

04/22 14:04, , 5F
你應該關掉再測試看看是不是 -fstack-protector
04/22 14:04, 5F

04/22 14:32, , 6F
剛測了 沒錯是fstack-protector
04/22 14:32, 6F

04/22 14:42, , 7F
IdFormat: 是 32bit 還是 64bit環境? epb 應該是 32 bit
04/22 14:42, 7F

04/22 15:00, , 8F
gcc 是那一版?
04/22 15:00, 8F
文章代碼(AID): #1HT7LCg0 (C_and_CPP)