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灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP