. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->第一个程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  怎么没人回答啊,老大!  [待解决] 回复[ 2次 ]   点击[ 378次 ]  
wsay666
[帖 主]   [ 发表时间:2009-07-02 10:41 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
大家知道,如果4不改成6以上,DEBUG提示非法.我不明白的是:这段程序的栈段是如何设的,是多大?仅仅是 SS和SP知道了,但并不知道,段的大小啊.并且这个栈段初始是什么样的?如果第一个POP AX 没超界的话,那这个栈段一定大于20000H-20004H.最少是16字节,但这是怎么来的呢??还有如初始栈空间为空的话,SS:SP批向栈底的下一单元,直接POP的话不又超界了吗?. 
苦恼啊,是我笨,还是我在钻牛角尖呢?不得其解! 
assume cs:codesg 
codesg segment  
        mov ax,2000h 
        mov ss,ax 
        mov sp,0 
        add sp,4 
        pop ax 
        pop bx 
        push ax 
        push bx 
        pop ax 
        pop bx 
        mov ax,4c00h 
        int 21h 
        codesg ends 
        end
wsrf
[第1楼]   [ 回复时间:2009-07-02 13:46 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1005&qkSg=2&qID=38093&readSg=1
wsay666
[第2楼]   [ 回复时间:2009-07-02 14:03 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
栈段设置的很清楚,SS:SP起始值为2000:4,在8086汇编中,栈段的大小是没有给出的(没有实现这种机制),所以你可以一直压栈,直到发生越界。即当ss:sp=2000:0时,再压栈就会变为2000:fffe。 

“如果第一个POP AX 没超界的话,那这个栈段一定大于20000H-20004H.最少是16字节,但这是怎么来的呢?”同样,对于8086汇编中,如果一个段的实际占用空间大小不是16的倍数,那么就会把占用空间扩展成16的整数倍。而在这个程序里,只有一个代码段,它的栈段的起始地址就是2000:4,至于占空间大小,同样是个未知数。引起非法提示错误的原因是,在DEBUG运行程序的一条指令时,会执行单步中断(后面会学到),单步中断需要压栈,这样入栈时就会越界(即sp从0到fffe),这在虚拟8086模式下是不允许的,所以会弹出错误提示,但在实模式下运行是没有问题的。(可参看附注1)
以上引自楼上的话.
如果是这样,朋友们看看理解正不正确:当前SP指向2000:4,则现在连续进行六次出栈操作,即六次pop ax  这时SP指向了 2000H:10H,如果再接着出栈,POP AX 那应该就是超界了吧?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved