. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->第一个程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于实验3 设置栈段的问题,又急哭了!  [已解决] 回复[ 2次 ]   点击[ 532次 ]  
wsay666
[帖 主]   [ 发表时间:2009-07-01 16:14 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
大家知道,如果4不改成6以上,DEBUG提示非法.我不明白的是:这段程序的栈段是如何设的,是多大?仅仅是 SS和SP知道了,但并不知道,段的大小啊.并且这个栈段初始是什么样的?如果第一个POP AX 没超界的话,那这个栈段一定大于20000H-20004H.最少是16字节,但这是怎么来的呢?不得其解!
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:43 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
栈段设置的很清楚,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)
wsay666
[第2楼]   [ 回复时间:2009-07-02 13:53 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
此贴由 贴主 于 [ 2009-07-02 13:53 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(wsrf):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved