|
主题 : : 关于实验三以及程序6.3的栈空间问题 [待解决] |
回复[ 3次 ]
点击[ 462次 ] | |
|
|
|
|
[帖 主] [ 发表时间: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个字节的最后几个字节的数据会被调试信息覆盖, 我们最终拷贝的数据是不对的
反正我把书上的例子单步调试了一下, 结果并不正确, 不知道是我哪儿写错了, 还是其他问题, 大家没有发现这个问题吗? | | |
|
|
|
|
[第2楼] [ 回复时间:2009-01-21 15:06 ] | |
荣誉值: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 另外一个是什么, 没有仔细分析, 还没有看出来 | | |
|