看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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