. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
主题 : :  关于实验三以及程序6.3的栈空间问题  [待解决] 回复[ 3次 ]   点击[ 462次 ]  
cnhnyu
[帖 主] [ 发表时间:2009-01-21 14:55 ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
p88实验三:
code segment
        assume cs: code

main proc
        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
main endp

code ends
        end main


p118 程序6.3

        assume cs:code
code segment

dw        1234h, 5678h, 9abch, 0def1h, 2345h, 6789h, 0abcdh, 0ef01h
dw        0, 0, 0, 0, 0, 0, 0, 0

start:
        mov        ax, cs
        mov        ss, ax
        mov        sp, 32

        mov        cx, 8
        mov        bx, 0
      s:
        push        cs:[bx]
        add        bx, 2
        loop        s

        xor        bx, bx
        mov        cx, 8
      t:
        pop        cs:[bx]
        add        bx, 2
        loop        t

        mov        ax, 4c00h
        int        21h

code ends
        end start

这2个程序的共同点就是程序中改变了默认的栈空间, 从而使得ss, sp指向我们自己定义的栈空间,
在实验三中,我们用add sp, 4设置栈空间的大小, 用debug调试的时候, 由于产生了单步中断,debug为了保存状态信息占用了我们的栈空间, 而由于我们的栈空间太小, 调试的时候会缠身越界, 系统会产生保护错误。
程序6.3中, 虽然mov sp, 32, 栈空间足够大了, 但是问题是,我们要把16字节的数据倒序拷贝到一个16字节空间大小栈中, 显然, 如果再加上单步中断的信息, 那么, 16字节的空间是不够的, 结果是, 前面16个字节的最后几个字节的数据会被调试信息覆盖, 我们最终拷贝的数据是不对的

反正我把书上的例子单步调试了一下, 结果并不正确, 不知道是我哪儿写错了, 还是其他问题, 大家没有发现这个问题吗?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved