. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第六章试验5第2题第(4)小题关于段空间的问题  [已解决] 回复[ 4次 ]   点击[ 468次 ]  
huibian2009
[帖 主]   [ 发表时间:2009-07-22 10:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
我看了大家前一阵子讨论的这个问题的帖子,仍然不太理解,还望各位指点。例如我做的实验5第2题,程序运行后可以发现,cs=0b4c,ds=0b4a,ss=0b4b,这有三个段地址,那么ss段的空间为多大呢?假设我们定义了4个字节,那么它占用的空间应该就是4个字节吧,但是如果这时我们压入栈的数据大于了4个字节,那么其后续的空间是不是仍然会当作栈空间来用呢。而提到的算式为:(N/16+1)*16(N/16只取整数部分) ,可能是我太笨,总也看不懂算式所代表的意思,如果我用上面的例子来套这个公式(4/16+1)*16=(0+1)*16=16B?难道是16字节吗?还有这里的乘以16是什么意思?
假如我设栈空间的段地址为1000,在这段空间中定义了4个字节的数据,并且把栈顶设置为4,那么我将内存0000:0-6的数据向栈内压,到了最后两个字节应该溢出了,也就是继续占用了1000:4后面的空间,那么此时的段空间大小又该如何理解呢,以上是本人的拙解,请各位老师批评指正。谢谢!
tsembrace
[第1楼]   [ 回复时间:2009-07-22 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
8086是无法设置栈段空间大小的。可以依据对栈使用情况的预判通过设置合理的sp以满足使用要求。需要掌握的就是push/pop两种情况时候sp何时改变,如何改变;以及ss:sp始终指向栈顶单元。

-a
0AF5:0100 mov ax,1000
0AF5:0103 mov ss,ax
0AF5:0105 mov sp,4
0AF5:0108 mov bx,0001
0AF5:010B push bx
0AF5:010C add bx,0202
0AF5:0110 push bx
0AF5:0111 add bx,0202
0AF5:0115 push bx
0AF5:0116 pop cx
0AF5:0117 pop cx
0AF5:0118 pop cx
0AF5:0119
-g 0116

AX=1000  BX=0405  CX=0000  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=0AF5  ES=0AF5  SS=1000  CS=0AF5  IP=0116   NV UP EI PL NZ NA PE NC
0AF5:0116 59            POP     CX
-d 1000:0 3
1000:0000  03 02 01 00                                       ....
-d 1000:fffe ffff
1000:FFF0                                            05 04
-t

AX=1000  BX=0405  CX=0405  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0AF5  ES=0AF5  SS=1000  CS=0AF5  IP=0117   NV UP EI PL NZ NA PE NC
0AF5:0117 59            POP     CX
-t

AX=1000  BX=0405  CX=0203  DX=0000  SP=0002  BP=0000  SI=0000  DI=0000
DS=0AF5  ES=0AF5  SS=1000  CS=0AF5  IP=0118   NV UP EI PL NZ NA PE NC
0AF5:0118 59            POP     CX

通过以上debug,可以看出,"栈超界"其实可以看做是对栈空间的扩展,因为超界部分依然可以进行栈操作;原因只在于:ss:sp始终指向栈顶。
tsembrace
[第2楼]   [ 回复时间:2009-07-22 17:26 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
关于第一个问题,定义单个数据段后,内存为其开辟的空间以16个字节为一个单位。如,如果该数据段定义了4个字节数据,不满16字节,则内存为其分配补齐16字节空间;如果定义了9个字数据,其超过16字节,但不到32字节,内存为其分配32字节空间。至于公式的不用去记,关键在于知道原因。(N/16+1)*16这个公式在N=16的情况下是有问题的。
楼主理清了上面的还可以考虑下以下两种情况的内存空间分配的差别:
1、
data0 segment
  db 1,1
data0 ends
data1 segment
  dw 2,2,2,2,2
data1 ends
2、
data segment
  db 1,1
  dw 2,2,2,2,2
data ends
huibian2009
[第3楼]   [ 回复时间:2009-07-23 10:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
十分感谢tsembrace 老师的精彩解答,使我明白了栈空间的使用方法,也对段空间这一概念有了更进一步的认识,相信有这么多老师的帮助,我的学习一定会很顺利的。再次对所有帮助过我的老师表示衷心的感谢。
huibian2009
[第4楼]   [ 回复时间:2009-08-24 11:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
此贴由 贴主 于 [ 2009-08-24 11:55 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved