Re: [問題] struct 取值跟宣告

看板C_and_CPP作者 (咕啾咕啾魔法陣)時間13年前 (2010/10/15 09:12), 編輯推噓7(7022)
留言29則, 6人參與, 最新討論串2/3 (看更多)
※ 引述《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)

10/15 09:30, , 1F
推一個
10/15 09:30, 1F

10/15 12:28, , 2F
總覺得怪怪的,int a也暫用一個堆積,呼叫也用了一個
10/15 12:28, 2F

10/15 12:35, , 3F
你說呼叫funcA();?
10/15 12:35, 3F

10/15 12:43, , 4F
一般來說不會寫這麼危險的程式碼吧
10/15 12:43, 4F

10/15 12:44, , 5F
堆積、堆疊、堆棧,一堆堆,聽得都亂了
10/15 12:44, 5F

10/15 12:51, , 6F
其實堆積是heap
10/15 12:51, 6F

10/15 12:54, , 7F
用中文都會搞錯XD
10/15 12:54, 7F

10/15 12:57, , 8F
test.a[0]--funcA()下一行的位址--main的ebp--???--a
10/15 12:57, 8F

10/15 12:58, , 9F
由高位址到低位址長這樣,???是compiler可能塞的東西
10/15 12:58, 9F

10/15 13:02, , 10F
沒問題啊 funcA ebp 指向 main ebp 其下放的就是 int a[10]
10/15 13:02, 10F

10/15 13:17, , 11F
我推文忘了寫暫存器的備份
10/15 13:17, 11F

10/15 13:33, , 12F
前陣子剛好在想,用 inline assembly 時,需不需要擔心會
10/15 13:33, 12F

10/15 13:33, , 13F
跟編譯器的最佳、CPU的cahce機制有衝突,不知道有沒有版友
10/15 13:33, 13F

10/15 13:34, , 14F
有經驗?還望分享,感謝
10/15 13:34, 14F

10/15 13:34, , 15F
最佳化
10/15 13:34, 15F

10/15 13:39, , 16F
最佳化有時會影響放變數的方式,可能會讓ebp-***的指令
10/15 13:39, 16F

10/15 13:39, , 17F
出錯
10/15 13:39, 17F

10/15 13:43, , 18F
gcc可以指定clobber list表示這段code使用過哪些reg
10/15 13:43, 18F

10/15 13:45, , 19F
也可以指定operand讓gcc把變數代換成正確的reg/mem
10/15 13:45, 19F

10/15 13:46, , 20F
簡而言之就是讓compiler知道你動用了那些變數和reg
10/15 13:46, 20F

10/15 13:46, , 21F
這樣在optimization就比較不會出問題
10/15 13:46, 21F

10/15 13:47, , 22F
像本文這種方式是很容易出錯的
10/15 13:47, 22F

10/15 13:49, , 23F
受教了,感謝兩位,很有用的資訊
10/15 13:49, 23F

10/15 13:50, , 24F
這個程式會出錯,原因八成是在ebp跟local var之間多了
10/15 13:50, 24F

10/15 13:51, , 25F
其他東西進去,不同compiler的結果可能因此不同
10/15 13:51, 25F

10/15 14:06, , 27F
上面這篇文章,是微軟對此議題的說明
10/15 14:06, 27F

10/15 14:08, , 28F
frame pointer omission (FPO),差點忘了這東西,也會影響
10/15 14:08, 28F

10/15 14:08, , 29F
EBP變不能用
10/15 14:08, 29F
文章代碼(AID): #1CjwgKyz (C_and_CPP)
文章代碼(AID): #1CjwgKyz (C_and_CPP)