. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  源程序中,为什么段不能大于64K?  [已解决] 回复[ 4次 ]   点击[ 374次 ]  
wang_ss
[帖 主]   [ 发表时间:2011-09-23 13:10 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
根据段的概念,偏移地址最大是FFFFH,所以一个段不大于64K。
而第6章(P130)中“但如果数据、栈和代码需要的空间超过64K,就不能放在一个段中”这句话难以理解?
为什么不能超过64K,超过了会出现哪些问题?

对于栈而言,如果超过64K,则采用SA:EA(SA为定值)的方式会出现部分空间访问不到。
对于代码段,如果一段超过64K的代码,中间无任何跳转,这样的程序可以吗?
chinatree
[第1楼]   [ 回复时间:2011-09-24 02:09 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
怎么样都可以,你可以做个实验呀,定义80KB的数据,如
db 0ffffh dup (1)
db 1000 dup (1)
用debug的D命令查看那些超过64k的部分在什么地方。我没有做过,不确定能不能过编译器。
对于栈段,并不是说部分空间访问不到,假如设定栈顶为0ffffh,当前栈顶为0,在sp=0Ffffh的地方有着重要的数据,这时执行压栈操作,Sp=sp-2,将Ss:0fffeh处的数据覆盖掉,称为栈顶超界,但是压栈操作有效。在xp下发生栈定超界操作系统会报错,在纯dos下不会。
对于代码段,在没有任何跳转的情况下超过64k的部分将不会得到执行,因为ip指不到那。同样可以做个实验,
code segment
assume cs:code
db 0fffah dup (1);估计不一定能通过编译。
s:add ax,1;将从这里执行。
add ax,1;随便什么指令都行。
add ax,1;除了一些改变cs和ip的。
add ax,1;这里应该超过64k了吧。
code ends;注意查看ip和cs。
end s
chinatree
[第2楼]   [ 回复时间:2011-09-24 02:11 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
楼主可以算下在不动cs的情况下ip能指向多大的空间?
wang_ss
[第3楼]   [ 回复时间:2011-09-25 10:52 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
楼主可以算下在不动cs的情况下ip能指向多大的空间?
------------------
回复:是64K,
明白了,更深入点理解应看书上第26页展示的8086CPU读取、执行一条指令的过程。其中说到读取一条指令后IP中的值自动增加。
如果一个代码段超过64K,在无跳转指令等的情况下只能执行CS:0000H~CS:FFFFH空间的指令,所以一个代码段应小于64K。
wang_ss
[第4楼]   [ 回复时间:2011-09-25 11:18 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
此贴由 贴主 于 [ 2011-09-25 11:18 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved