|
主题 : : 关于实验三以及程序6.3的栈空间问题 [待解决] |
回复[ 3次 ]
点击[ 457次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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个字节的最后几个字节的数据会被调试信息覆盖, 我们最终拷贝的数据是不对的
反正我把书上的例子单步调试了一下, 结果并不正确, 不知道是我哪儿写错了, 还是其他问题, 大家没有发现这个问题吗? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-01-21 15:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
嗯,单步跟踪的时候,就是楼主分析的那样的。所以,如果单步跟踪还需要做写细节处理的。 | | |
|
|
|
|
[第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 另外一个是什么, 没有仔细分析, 还没有看出来 | | |
|
|
|
|
[第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比较肯定之外, 其它的还不是太确定 | | |
|