推 hhashoww:推一個 10/15 09:30
→ stupid0319:總覺得怪怪的,int a也暫用一個堆積,呼叫也用了一個 10/15 12:28
→ loveflames:你說呼叫funcA();? 10/15 12:35
→ stupid0319:一般來說不會寫這麼危險的程式碼吧 10/15 12:43
推 purpose:堆積、堆疊、堆棧,一堆堆,聽得都亂了 10/15 12:44
→ loveflames:其實堆積是heap 10/15 12:51
→ stupid0319:用中文都會搞錯XD 10/15 12:54
→ loveflames:test.a[0]--funcA()下一行的位址--main的ebp--???--a 10/15 12:57
→ loveflames:由高位址到低位址長這樣,???是compiler可能塞的東西 10/15 12:58
→ firose:沒問題啊 funcA ebp 指向 main ebp 其下放的就是 int a[10] 10/15 13:02
→ loveflames:我推文忘了寫暫存器的備份 10/15 13:17
推 purpose:前陣子剛好在想,用 inline assembly 時,需不需要擔心會 10/15 13:33
→ purpose:跟編譯器的最佳、CPU的cahce機制有衝突,不知道有沒有版友 10/15 13:33
→ purpose:有經驗?還望分享,感謝 10/15 13:34
→ purpose: 最佳化 10/15 13:34
→ loveflames:最佳化有時會影響放變數的方式,可能會讓ebp-***的指令 10/15 13:39
→ loveflames:出錯 10/15 13:39
推 littleshan:gcc可以指定clobber list表示這段code使用過哪些reg 10/15 13:43
→ littleshan:也可以指定operand讓gcc把變數代換成正確的reg/mem 10/15 13:45
→ littleshan:簡而言之就是讓compiler知道你動用了那些變數和reg 10/15 13:46
→ littleshan:這樣在optimization就比較不會出問題 10/15 13:46
→ littleshan:像本文這種方式是很容易出錯的 10/15 13:47
推 purpose:受教了,感謝兩位,很有用的資訊 10/15 13:49
→ loveflames:這個程式會出錯,原因八成是在ebp跟local var之間多了 10/15 13:50
→ loveflames:其他東西進去,不同compiler的結果可能因此不同 10/15 13:51
→ purpose:上面這篇文章,是微軟對此議題的說明 10/15 14:06
推 purpose:frame pointer omission (FPO),差點忘了這東西,也會影響 10/15 14:08
→ purpose:EBP變不能用 10/15 14:08