用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,只是用了不同的偏移地址而已。为什么操作系统就喜欢把偏移地址置零,然后把偏移地址中的部分加到段地址中,增加段地址的数值呢。
不知道我表达清楚了没有,请前辈些给我看看,解惑,我现在卡在这儿了,没办法继续学下去,小生先拜谢了!!!