标题:求赐教:王爽第二版第6章实验5第三题
只看楼主
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
结帖率:66.67%
已结贴  问题点数:20 回复次数:6 
求赐教:王爽第二版第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
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
如果你会计算物理地址就知道是什么回事了。
我觉得:首先编译器会使用连续的地址,所以你程序里不管代码、数据还是堆栈,编译后其物理地址是要按规矩连续给。其次,由于8086系列使用“段+偏移”的逻辑地址机制,实际物理地址为“段*16+偏移”,所以不同段的实际物理地址都是16的倍数。最后,根据你反应的情况,说明你的代码段占用的空间大于16字节小于32字节,所以数据段地址比2.

能编个毛线衣吗?
2015-08-03 09:58
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
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 3楼 Kristian_Tam
不是吧,理论上代码长度大于64KB会产生跨段,此时如有转移指令将是far转移,段内为near转移。

能编个毛线衣吗?
2015-08-03 16:02
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
得分:10 
    二楼wmf2014版主已经解释得很清楚了,我这里再重复一遍。
    首先系统将可执行文件载入内存,会找一块足够大的空间,然后在这块空间里先划出256字节(这部分称为PSP)用于程序与系统之间的通信,之后才是程序的指令和数据。
    比如:楼主的程序编译、链接后生成一个可执行文件,而后系统将其载入执行,找到一块足够大的空间,其起始地址为075a0H,而后系统在这块空间中划出256字节(PSP,大小为100H),则代码段紧随其后,那么代码段的起始地址就是075a0H+100H=076a0H,代码段的段地址就是076aH。经过计算可知,代码段的大小为34个字节(或者用DEBUG加载可执行文件,也可以看出代码段的字节数。),则根据段地址都是16的倍数可以知道,代码段实际要占用48个字节(30H),所以076aH*10H+30H=076d0H就是后面数据段的起始地址,自然数据段的段地址就是076dH。
同理,数据段之后的堆栈段段地址就是076eH。
    希望以上分析能够帮到楼主。
2015-08-03 22:19
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
得分:0 
回复 5楼 取名字
啊~~原来是这样!我一直纠结076ah这一段内存的容量所以不自觉的把内存空间分段成具体容量的存储块了,其实真正划分段的是cpu,并且是通过把具体的物理地址拆解成(段地址*16+偏移地址)来分段的。明白了,感谢两位这么耐心地解决了我得困扰。请受小弟一拜!
2015-08-04 11:47
wswit
Rank: 1
等 级:新手上路
帖 子:9
专家分:6
注 册:2014-5-27
得分:0 
回复 5楼 取名字


如图


[此贴子已经被作者于2016-1-13 16:55编辑过]

2016-01-13 16:49



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




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

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