ASM 板


LINE

看板 ASM  RSS
學過system programming或OS的人都知道 一個program可以分成code(text)、data、stack以及heap(bss)這四個segment 對x86來說就是用cs、ds、ss、es、fs和gs來assign各個segment的start address 理論上這四個segments是可以透過segment register來分離memory space的 也就是說在VM的支援下這些segments都可以享有各自獨立且互不影響的4GB memory space 但是許多C/C++ compiler在實作上會利用stack來暫存function的local variables 這將會導致一個問題出現------ss和ds必須共用一個4GB的memory space 否則在傳遞call by reference的pointer過程中將會出現非常嚴重地邏輯錯誤 舉個例子來說 main() { func_1(); } void func_1() { int x = 1; func_2(&x); } void func_2(int *ptr) { *ptr = 10; } 正常來說這段程式在執行後func_1的x應該會等於10才對 假設今天ds、ss、bp和sp的值分別為 ds = 0x0000 ss = 0x1000 bp = 0x1000 sp = 0x1000 將這段程式用gcc compile之後會產生這樣的assembly code func_1: pushl %ebp movl %esp, %ebp subl $20, %esp // 清出20 bytes給local variables使用 // esp = 0x0fe0 movl $0, %eax movl $1, -4(%ebp) // 將x的值存放在stack(0x1000:0x0ffc)中 leal -4(%ebp), %eax // 將&x放入eax中 movl %eax, (%esp) // 將eax置入stack(0x1000:0x0fe0)中 call func_2 leave ret func_2: pushl %ebp movl %esp, %ebp leal 8(%ebp), %eax // 將ptr所指向的address放入eax中 // eax = 0x0ffc movl $10, (%eax) // 將10放入(%eax)裡 popl %ebp ret 問題就出現在紅色這一行instruction (%eax)在x86裡隱含的實際意義應該是%ds:(%eax)而非%ss:(%eax) 也就是說實際上程式是把10放到了0x0000:0x0ffc 但是x正確address的應該是在0x1000:0x0ffc 以上是最近一個月在寫一些low level的system program時遇到的問題 之前把ds和ss分開設在不同的地方 結果只要一遇到pointer的傳遞,程式執行的結果就會出錯 到最後才發現是因為GCC是利用stack來存放local variables造成的 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.105.115
1F:→ lungswu:請問這是reasl mode,還是protected mode,看起來怪怪的 05/10 07:44
應該是protect mode和real mode都適用 只是我為了方便說明 所以ds和ss存的值不是用LDT或GDT來表示 而是直接用他們的segment start address 況且GCC好像也沒辦法編出real mode下16-bits的code ※ 編輯: SILee 來自: 61.59.105.115 (05/10 14:44)
2F:推 Ross0916:我感覺你的文章也有很嚴重的觀念錯誤 05/10 22:37
3F:→ Ross0916:segment 跟 section 是兩回事 05/10 22:37
4F:→ Ross0916:而且PM下 segment register 改成 selector 了 05/10 22:39
5F:→ Ross0916:不是"assign各個segment的start address" 05/10 22:39
6F:→ Ross0916:再來 你幹嘛亂設 ss 跟 ds? 05/10 22:41
7F:→ Ross0916:local var 放 stack 是標準做法 不然哪來的 enter/leave? 05/10 22:41
8F:推 ggg12345:如x=1宣告在main就是global變數,組語會帶入ds:offset嗎? 05/11 16:47
9F:推 lungswu:感覺這code是從power on reset之後在組合語言階段進入 05/12 08:11
10F:→ lungswu:protect mode,再由組合語言呼叫這些C function 05/12 08:12
11F:→ lungswu:導致DS SS沒設好,也導致原PO對real mode,protect mode 05/12 08:13
12F:→ lungswu:中,segment,section有些搞不清楚 05/12 08:14
13F:→ final01:memory space應該用address space這專有名詞比較正確 05/12 13:09
14F:→ final01:而且跟vm沒關係才對~那是X86的段機制 05/12 13:09
15F:推 ggg12345:就C言,func1的local變數值不該被外部變動,函數如公式不變 05/12 14:18
16F:→ ggg12345:global變數是各函數可共用的區域,才會使用pointer傳值. 05/12 14:22
17F:推 wowtiger:PM下segment好像在linear address上面 cs之類則selector 05/31 11:08







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP