标题:用debug跟踪时,关于程序加载后DS、SS、CS关系的疑问,请高手指正,正卡壳中 ...
只看楼主
flat2010
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-1-14
结帖率:100%
已结贴  问题点数:20 回复次数:6 
用debug跟踪时,关于程序加载后DS、SS、CS关系的疑问,请高手指正,正卡壳中,谢谢!!!
刚学汇编不久,因为不是计算机专业出身的,所以进度比较慢,学起来也比较吃力。如果发的问题比较弱智,还请大家不要笑话,拍砖轻些,初来贵坛,这也是我的处女贴,还请各位前辈多多指教!
    进入正题,我用的是王爽老师的第二版,开始之前我是把序都仔仔细细读过一遍的,我也是严格按照王老师的要求来学的,没学懂坚决不往下学,书后的实验不会的,反复做,反复揣摩,直到完全弄明白为止。现在学到第六章——包含多个段的程序。书后实验5(3):
    assume  cs:code,ds:data,ss:stack
    code    segment
    start:  mov ax,stack
            mov ss,ax
            mov sp,16

            mov ax,data
            mov ds,ax

            push ds:[0]
            push ds:[2]
            pop  ds:[2]
            pop  ds:[0]

            mov ax,4c00h
            int 21h
    code ends

data    segment
  dw 0123h,0456h
data    ends

stack  segment
  dw 0,0
stack  ends

end    start

①CPU执行程序,程序返回前,data段中的数据是多少。(答:不变。这个我明白)
②CPU执行程序,程序返回前,cs=__,ss=__,ds=__。(答:cs、ss、ds的具体数值因机器而不同,但SS=CS+4,DS=CS+3。这题没懂,下面详述)
③设程序加载后,code段的段地址为X,则data段的段地址为____,stack段的段地址为____。(答:X+3,X+4。这个跟上题一样)

    第二题中,我用debug跟踪,发现答案是对的。但我就是想不明白,因为程序中code段的大小远远不足64kb,大可以为SS、CS、DS分配同一个段地址,而使用偏移地址来区别。但为什么我们的OS没有这么做,而是给他们分配了不同的段地址。之前我在网上找了一下,没找到能让我真正想明白的答案。先补充一点,CS:0010和CS+1:0000其实指向的是同一个物理地址这个我明白,大虾门不用担心了,我看网上有大侠在说那个提问的人这个问题都还没弄清楚。上题中假设程序返回前,CS的值为X,而code段占了3行(48字节),那我们大可使用X:40h-X:4Fh作为data段,X:50h-X:5Fh作为stack。也就是说,DS、SS、CS的段地址可以一样,都为X,只是用了不同的偏移地址而已。为什么操作系统就喜欢把偏移地址置零,然后把偏移地址中的部分加到段地址中,增加段地址的数值呢。
    不知道我表达清楚了没有,请前辈些给我看看,解惑,我现在卡在这儿了,没办法继续学下去,小生先拜谢了!!!
搜索更多相关主题的帖子: 计算机专业 多多 start 笑话 
2012-01-14 22:18
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
得分:10 
1. 而code段占了3行(48字节)??? 我怎么觉得是0x42个byte, 你怎么算的类, debug出来是0x44,认为最后多了2字节0000,对齐?
2. 你想法没错啊,所以有com文件的嘛,一个段全搞定,当然你就得保证cs:ip不会访问到你的堆栈空间和数据空间
3. 编译器才不管你多分配了还是少分配了,合并段是你的事,要一个段就做成com,有个工具叫exe2bin,你下载了用用

技术问题,请不要以短消息方式提问
2012-01-14 23:48
flat2010
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-1-14
得分:0 
回复 2楼 zaixuexi
仁兄留步,code段确实不止48字节,我的电脑上是ox44。我是在其他论坛上搜答案的时候看到有人说是3行。你第2、3点说的是什么意思我不太明白还望明示。
2012-01-15 00:32
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
得分:10 
好吧,一点一点解释
问:因为程序中code段的大小远远不足64kb,大可以为SS、CS、DS分配同一个段地址,而使用偏移地址来区别。
答:可以的,假设SS=CS=DS=0x1000,cs=[0, 0x21],ss=[0x22, 0x31],ds=[0x32,0x41]
那么访问的时候按照ss:0x22~ss:0x31,ds按照ds:0x32:0x41,没问题吧?
问:但为什么我们的OS没有这么做,而是给他们分配了不同的段地址。
答:因为你使用了段定义伪指令segment,如果还不明白,请google
问:之前我在网上找了一下,没找到能让我真正想明白的答案。
答:其实你就是要问,为什么要划分逻辑段?这个是由你来决定的,对于分段内存,由写代码的人来考虑需要几个逻辑段,和os无关。
问:为什么操作系统就喜欢把偏移地址置零,然后把偏移地址中的部分加到段地址中,增加段地址的数值呢。
答:因为从逻辑上来看,更加清晰,当然你可以只使用一个64k byte的段空间(com文件),只要你分的清楚,你使用的地址空间的各个部分是干吗用的
不知道我这样算是解释清楚了没有

技术问题,请不要以短消息方式提问
2012-01-15 09:27
flat2010
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-1-14
得分:0 
回复 4楼 zaixuexi
感谢这位仁兄的耐心讲解,第一次提问就能得到你的细心帮助,真是感激之至。大部分问题我懂了,不过你第二个答复中的:因为你使用了伪指令segment,所以OS分配了不同的段地址,不懂请google。这个google关键字该用哪些,我搜了下没找到,还请再明示,我比较笨了,呵呵,谢谢先。
2012-01-15 21:37
flat2010
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-1-14
得分:0 
回复 5楼 flat2010
还有个问题要请教仁兄,就是不用debug追踪,只看程序,如何确定源程序究竟占用多少内存空间呢?
2012-01-16 00:28
asd605499941
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-1-25
得分:0 
这个实验是想说明,每个段有不同的段地址,而且是16的倍数
2012-01-25 20:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-359672-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.471092 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved