. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  栈段的位置不同 占用空间也不同?  [已解决] 回复[ 5次 ]   点击[ 487次 ]  
huangbeidu
[帖 主]   [ 发表时间:2009-04-01 21:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:3
注册日期:2009-03-10 11:22
就是这个问题了 从实验5(3)引发的
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1007&qkSg=2&qID=31302&readSg=1 问过很久也没有人解决

又有了新发现:

数据段是dw 123h,456h  栈段是dw 0,0

顺序:数据 代码 栈时的debug:
17D9:0100  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
17D9:0110  B8 ED 17 8E D0 BC 10 00-B8 E9 17 8E D8 FF 36 00   ..............6.
17D9:0120  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
17D9:0130  CD 21 00 00 00 00 00 00-00 00 00 00 00 00 00 00   .!..............
17D9:0140  00 00 00 00 75 10 8A 05-38 46 06 75 09 B8 FF FF   ....u...8F.u.... 
顺序:代码 栈 数据时的debug:
17D9:0100  B8 EC 17 8E D0 BC 10 00-B8 ED 17 8E D8 FF 36 00   ..............6.
17D9:0110  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
17D9:0120  CD 21 00 00 00 00 00 00-00 00 00 00 00 00 00 00   .!..............
17D9:0130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17D9:0140  23 01 56 04 75 10 8A 05-38 46 06 75 09 B8 FF FF   #.V.u...8F.u....
顺序:数据 栈 代码时的debug:
17D9:0100  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
17D9:0110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17D9:0120  B8 EA 17 8E D0 BC 10 00-B8 E9 17 8E D8 FF 36 00   ..............6.
17D9:0130  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
17D9:0140  CD 21 56 04 75 10 8A 05-38 46 06 75 09 B8 FF FF   .!V.u...8F.u....
也就是说 如果哪个段在程序的最后 而且大小不是16B的倍数 那么它剩余的最后一行空间会被充分利用 不会都是0 这样内存就不会浪费了 

我这样理解对吗 如果是这样 那么实验5(2)的第四问:
对于如下定义的段:
name segment
……
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为________

应该这样答:如果N为16的倍数
            或N不为16的倍数但该段在程序的最后 答案为N Byte
            其他情况答案为([N/16]+1)*16 Byte
mess
[第1楼]   [ 回复时间:2009-04-02 14:46 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
不错,我做这个的时候都没有注意到这个细节 ^_^

在完整段的定义里面有个“定位类型”的概念,缺省默认是para(就是上面的情况)。还可以使用byte、word 等类型,代码就会变的更紧密,比如用byte,段实际占用的空间是N,前后两个段间没有空闲单元,是最节约内存的定位类型。
mess
[第2楼]   [ 回复时间:2009-04-02 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
最有一个段后面的内容已经不是我们程序定义的范围了,所以我们程序中默认的para类型也就不适用最后一个段所占的内存空间了。也就是上面楼主提到的debug情况了。
huangbeidu
[第3楼]   [ 回复时间:2009-04-02 16:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:3
注册日期:2009-03-10 11:22
不好意思啊 我现在才学到第十章 不是太懂你的意思啊 我往后面翻翻看看什么是para
abob
[第4楼]   [ 回复时间:2009-04-02 16:56 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
定位类型王老师这本书上没讲,简单的说就是程序定义的段所占实际内存是N的倍数(默认是para,N=16-也就是书的情况 设置为byte即N=1 word即N=2)对程序运行没有影响,只对程序加载后内存占用有些影响。
huangbeidu
[第5楼]   [ 回复时间:2009-04-12 14:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:3
注册日期:2009-03-10 11:22
此贴由 贴主 于 [ 2009-04-12 14:06 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(mess):1分   4楼(abob):1分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved