看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《freeself (free)》之銘言: : struct S{ : int a[10]; : } : main(){ : S test; : test.a[0]=1; : } : funcA(){ : 這邊如果要取得 test 中的值要如何達到? : } 不用參數的取法 #include <stdio.h> struct S{ int a[10]; }; void funcA(){ int a; __asm{ mov edx,[ebp] mov ebx,[edx-40]//如果compiler有對齊之類的就未必是40 mov a,ebx } printf("test.a[0]=%x\n",a); } main(){ struct S test; test.a[0]=1; funcA(); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.75.245 ※ 編輯: loveflames 來自: 111.252.75.245 (10/15 09:20)
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