415968430 发表于 2011-12-26 17:47:56

030 第六章 包含多个段的程序02 中一个利用栈来反序的问题

老师的代码
assume cs:code
code segment
dw 0111h,0222h,0333h,0444h,0555h,0666h,0777h,0888h;我把这里数字改掉方便执行后查看,不知道是不是这里出问题啊,感觉不会是这里啊
dw 0,0,0,0,0,0,0,0
start:
mov ax,cs
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
s: push cs:
    add bx,2
    loop s

mov bx,0
mov cx,8
s0: pop cs:
add bx,2
loop s0

mov ax,4c00h
int 21h
code ends
end start
而我执行到cx=0005 bx=0008 push 执行了的时候(我原来的是 cs 146a, ip 20),本来是11 01 22 02 33 03 44 04 55 05-66 06 77 07 88 08
就在这时候变成了11 01 22 02 33 03 44 04 55 05-66 06 77 07 6a 14
当下次push 以后发现变成了11 01 22 02 33 03 44 04 55 05-66 06 6a 14 00 00
怎么回事????求助啊~~~~结果也是不对的

cqy55555 发表于 2011-12-26 21:26:29

本帖最后由 cqy55555 于 2011-12-26 21:27 编辑

哥们你这个问题和你另外一个问题是紧密相连的,单步运行会发现
当压入一个数据后,数据压入栈底,
而栈底内的系统写的程序运行信息往栈顶方向移动,
最后系统信息覆盖了0777h,0888h,你再压入栈肯定得不到想要的结果
都是系统搞的鬼。。。。
可以考虑把栈空间分配大一点。。。。



。。





415968430 发表于 2011-12-28 05:37:55

cqy55555 发表于 2011-12-26 21:26 static/image/common/back.gif
哥们你这个问题和你另外一个问题是紧密相连的,单步运行会发现
当压入一个数据后,数据压入栈底,
而栈底 ...

谢谢你的回答,弱弱的问下,其他程序数据怎么会覆盖进来的?这段空间不是分配给我的程序了吗?而且,我的程序这个栈段后面就是代码段啊,怎么直接来覆盖我的栈啊?{:2_25:}

cqy55555 发表于 2011-12-28 06:22:12

那些信息(当前程序的CS,IP,SS等信息)是你在分配堆栈时系统写入栈底的(要问为什么在这里写入这些信息额也不清楚,可能是“惯性”吧,在高级语言中,在函数调用分配堆栈前要保存当前IP,BP等信息)
在这个程序中你分配的堆栈空间的上部就存储了你将要压入堆栈中的数据,当你不断压入数据时,那些系统写入的信息不断向栈上部移动,最终YYY。。
最好别将存储数据的地方作为堆栈,其次,堆栈空间分配大一点。。。。
也不知道自己有没有写清楚。。。。

415968430 发表于 2011-12-28 06:33:05

cqy55555 发表于 2011-12-28 06:22 static/image/common/back.gif
那些信息(当前程序的CS,IP,SS等信息)是你在分配堆栈时系统写入栈底的(要问为什么在这里写入这些信息额也 ...

“那些信息(当前程序的CS,IP,SS等信息)是你在分配堆栈时系统写入栈底的”。。你的是意思也就是是说当前的CS IP SS等信息要放在栈底吗,那么每次定义一个某大小的栈时,而实际上要比定义的大小小一些吗(因为用来存放CS,SS,IP等)?
“在这个程序中你分配的堆栈空间的上部就存储了你将要压入堆栈中的数据,当你不断压入数据时,那些系统写入的信息不断向栈上部移动,最终YYY。。
”。。不是先进后出吗,要是的话不是那些信息是在栈底的呀,又怎么会会向上移动的啊?
求教~~~:'(

cqy55555 发表于 2011-12-28 07:27:15

本帖最后由 cqy55555 于 2011-12-28 07:33 编辑

415968430 发表于 2011-12-28 06:33 static/image/common/back.gif
“那些信息(当前程序的CS,IP,SS等信息)是你在分配堆栈时系统写入栈底的”。。你的是意思也就是是说当前 ...
额觉的根本没必要保存那些信息,因为这不是函数调用。。。
系统要为用户实现堆栈的功能,但它已占用堆栈的底部,但这地方是用户要压入数据的地方,所以向上移。。
也就是说系统的这一过程并不想让用户知道。。。他想让用户知道的是能正常的使用堆栈。。。
可惜被你发现了,额个人觉得这可能是Win32系统模拟虚拟8086模式时做的不够好的地方。。。。
在写Win32程序时就不会出现这种情况。。。
页: [1]
查看完整版本: 030 第六章 包含多个段的程序02 中一个利用栈来反序的问题