Re: [問題] 宣告的記憶體位址在windos跟linux差異

看板C_and_CPP作者 (返無)時間11年前 (2012/09/06 09:47), 編輯推噓3(304)
留言7則, 4人參與, 最新討論串3/3 (看更多)
※ 引述《NullLife (下雨的晚上)》之銘言: : 剛剛我在上課,老師講了一個東西讓我非常困惑不已... : 因為我非本科系出身,只是對寫程式很有興趣去自修的, : 對指標、記憶體位址有基本的認識,然後剛剛老師在suse下用Anjuta在講c的指標 : 就隨便寫了一個很簡單的內容: : int x=77; : printf("%p", &x); : > 0x7fff4c64a0ac 反組譯這段程式碼 0804841c <main>: 804841c: 55 push %ebp 804841d: 89 e5 mov %esp,%ebp 804841f: 83 e4 f0 and $0xfffffff0,%esp 8048422: 83 ec 20 sub $0x20,%esp 8048425: c7 44 24 1c 4d 00 00 movl $0x4d,0x1c(%esp) 804842c: 00 804842d: 8d 44 24 1c lea 0x1c(%esp),%eax 8048431: 89 44 24 04 mov %eax,0x4(%esp) 8048435: c7 04 24 e0 84 04 08 movl $0x80484e0,(%esp) 804843c: e8 bf fe ff ff call 8048300 <printf@plt> 我解釋如何才能達到你們老師說的那樣, 至於 os 怎麼載入 可執行檔我就不知道了。 movl $0x4d,0x1c(%esp) 0x4d = 77 所以這段程式碼就是 x=77; 因此要保證你們老師說的情況就是: 0x1c(%esp) 這個位址每次程式執行時都是那個值。 %esp 指向的是程式 stack 位址, 所以只要每次 os 載入程式執行檔 都保證這個值都一樣, 就有"可能"發生你們老師說的那樣。 為什麼只有"可能", 因為還要保證這個位址不會有其他程式使用, 當這個程式執行完畢後, 若有其他程式改了這位址的內容, 就算位址一樣, 它的值也不會再是 77 了。 這是在 linux (32bit 環境) 反組譯的結果, 這邊沒有提到 mmu 的 va -> pa, 可以想成一對一轉換, 不過原理都是一樣的。 這種作法通常是用來確定那個位址是可以那來用的, 或是 memory map register, 要不然不太能練習到這種寫法。 在嵌入式環境下很常看到這種寫法, 所以是有需要練習這樣的寫法。 如果練習作業系統之前的程式, 就可以毫無忌憚這樣練習。 : 秀出位址給我們看,然後就把秀出來的位址 0x7fff4c64a0ac 複製回程式裡... : printf("%d", *((int*)0x7fff4c64a0ac)); : 打算直接叫出位址裡的東西給我們看... : 當下我疑問就很大,不是每次宣告的時候,系統才配發給我們位址嗎? : 想當然是失敗了,不過老師卻很肯定只要程式沒更動,每次執行就會拿到同樣的位址, : 所以他回到windos用devcpp寫了一樣的程式碼, : 但這次就真的是每次執行,拿到x的位址就都是一樣了, : 把位址寫死可以去拿到x的值... : 於是老師就說可能是os的演算法有差異造成的... : 可是我又問說這樣很奇怪,如果說我這樣把位址寫死, : 拿到另一台電腦上執行不會有問題嗎? 老師卻說不會... : 這樣我疑問很大啊,怎麼可能每次位址都一樣?? : 可是在windos底下的情況的確又是這樣, : 想請問各位前輩到底是什麼情況呢?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.46

09/06 10:51, , 1F
這種作法用在global或static變數還有點sense,放在stack上
09/06 10:51, 1F

09/06 10:52, , 2F
就很奇怪了
09/06 10:52, 2F

09/06 10:55, , 3F
WOW 高手~大概了解了!! 所以應用在嵌入式系統上來說
09/06 10:55, 3F

09/06 10:55, , 4F
這是一個常見的用法?
09/06 10:55, 4F

09/06 10:58, , 5F
基本上除非那個位置有特殊用途(EX:IO port),不要這樣寫
09/06 10:58, 5F

09/07 01:24, , 6F
嵌入式裏面有些東西的 memory map 是 spec 規定好的XD
09/07 01:24, 6F

09/07 01:25, , 7F
那個算是特例啊...沒有那一大串.h的define會暈倒
09/07 01:25, 7F
文章代碼(AID): #1GI02WRn (C_and_CPP)
文章代碼(AID): #1GI02WRn (C_and_CPP)