标题:求赐教:王爽第二版第6章实验5第三题
取消只看楼主
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
结帖率:66.67%
已结贴  问题点数:20 回复次数:2 
求赐教:王爽第二版第6章实验5第三题
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


问题:程序加载后,设代码段地址为x(我电脑上是 076ah),则data段地址为(x+3,我电脑上是076dh);stack段地址为(x+4, 我电脑上是076eh)
??? 为什么啊?不同的段,段地址不是应该连续的么?我用D分别查看过 076bh和076ch段上确实有数据,那些数据是什么回事?

以上问题对前辈们来说可能比较弱智吧,请帮忙一下小弟,万分感激
搜索更多相关主题的帖子: start 
2015-08-03 07:34
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
得分:0 
回复 2楼 wmf2014
感谢回复!

一个段的起始地址都是16的倍数我懂了。可还有点疑惑,我的理解:是不是代码大于16kb就得开始另一个段呢?但偏移地址的变化(0000-ffff)远远大于16kb吧,即076ah*16+ffff足够存储16个kb把?那么为什么代码段的数据要保存到076bh和076ch呢?CPU到底怎样去确定我的代码段,数据段和栈段的长度呢?

再次感谢您
2015-08-03 15:55
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
得分:0 
回复 5楼 取名字
啊~~原来是这样!我一直纠结076ah这一段内存的容量所以不自觉的把内存空间分段成具体容量的存储块了,其实真正划分段的是cpu,并且是通过把具体的物理地址拆解成(段地址*16+偏移地址)来分段的。明白了,感谢两位这么耐心地解决了我得困扰。请受小弟一拜!
2015-08-04 11:47



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




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

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