. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于实验三以及程序6.3的栈空间问题  [待解决] 回复[ 3次 ]   点击[ 457次 ]  
cnhnyu
[帖 主]   [ 发表时间:2009-01-21 14:55 ]   [引用]   [回复]   [ top ] 
荣誉值: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个字节的最后几个字节的数据会被调试信息覆盖, 我们最终拷贝的数据是不对的

反正我把书上的例子单步调试了一下, 结果并不正确, 不知道是我哪儿写错了, 还是其他问题, 大家没有发现这个问题吗?
younggay
[第1楼]   [ 回复时间:2009-01-21 15:02 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
嗯,单步跟踪的时候,就是楼主分析的那样的。所以,如果单步跟踪还需要做写细节处理的。
cnhnyu
[第2楼]   [ 回复时间:2009-01-21 15:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
我把程序改了一下
        assume cs:code
code segment

dw        1234h, 5678h, 9abch, 0def1h, 2345h, 6789h, 0abcdh, 0ef01h
dw        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0   ; 这里增加了10个字节

start:
        mov        ax, cs
        mov        ss, ax
        mov        sp, 42 ; 这里增加了10个字节

        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

我在单步的时候, 始终发现有10个字节的数据占用了自己定义的栈空间, 其中这10个字节的数据包括:
cs, ip, psw, ss 另外一个是什么, 没有仔细分析, 还没有看出来
cnhnyu
[第3楼]   [ 回复时间:2009-01-21 15:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
比如, 当地一个字数据被压入栈中的时候,除了1234H本身之外,还有10个字节的额外数据:
0BFF:0000  34 12 78 56 BC 9A F1 DE-45 23 89 67 CD AB 01 EF
0BFF:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 FF 0B
0BFF:0020  00 00 3A 00 FF 0B D1 05-34 12 
这里面, 最后2个字节,就是我刚刚压入的一个个数据1234H
按照入栈的顺序, 接着的5个字数据是:
05D1H    0BFFH   003AH   0000H   0BFFH

此时的寄存器如下:
AX=0BFF  BX=0000  CX=0008  DX=0000  SP=0028  BP=0000  SI=0000  DI=0000
DS=0BEF  ES=0BEF  SS=0BFF  CS=0BFF  IP=003A   NV UP EI PL NZ NA PO NC
0BFF:003A 83C302        ADD     BX,+02

05D1H 估计是状态寄存器的值
0BFFH 是CS寄存器的值
003AH 是IP寄存器的值
0000H 这个不知道是什么, 难道是BP?
0BFFH 应该是SS的值吧
上面的5个WORD值,大部分都是猜测的,除了CS, IP比较肯定之外, 其它的还不是太确定
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved