关于栈的问题
例如这段代码:assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
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
实际运行后 ss地址是在ds末尾,也就是说这两个段是连续的,好,那么问题来了,我每次往ss段push的时候都有其他数据产生在sp前面,也就是当我push到第6、7个的时候,所谓的(其他数据)已经把我之前ds段末的数据给覆盖掉了,而后面再push的话不能push正确的值。
求教大虾能帮忙解惑,为什么每次push之后都有所谓的“其他数据”在sp的前面呢? 呵呵 楼主好~
问题:
为什么每次push之后都有所谓的“其他数据”在sp的前面呢?
分析: 首先,你要看看这个是个特殊的列子。
1,你要清楚,ds与ss的区别,
ds 是 数据段,是存放程序的要用到的数据的段地址, ss 是 栈段。是存放栈的段地址
2,(假设)ds,里有8个数据。分别是 00h,11h,22h....77h(十六进制) 那现在看看ds 和ss ,如果在一个段中。 sp执行 77h 的下个内存单元地址, 每次 push一次,那会怎么样呢 ? 呵呵,那当然是把原来的 ds 数据给覆盖了
这样就会错误了 。
希望能帮助你 bye~ 1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会停下来不继续往下执行?因为单步调式执行完一条命令后调用了一段中断处理子程序
3.被调用的这个 中断处理子程序里使用到了堆栈,当然,push了几次就pop了几次
4.这样,push进去的值破坏了原先的数据.但是pop后并不会恢复原先的值,仅仅是修正了sp
5.LZ知道为什么了吧 梦幻羽羽 发表于 2012-9-18 13:30 static/image/common/back.gif
呵呵 楼主好~
问题:
你理解错了,我ds和ss只是连续的,但并不是相等的,我所说的每次push之后都会有莫名其妙的“其他数据”在我push地址的前面,也就是说我还没push完就把之前准备要push的值给覆盖掉了 仰望天上的光 发表于 2012-9-18 13:48 static/image/common/back.gif
1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会 ...
额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧?也就是说我若不用单步调试的话,sp前面就不会出现所谓的"其他数据"?被调用的中断处理子程序使用的栈一定是我ss这个栈么? 鱼C版主果然是高手。学习了。 忏悔 发表于 2012-9-18 14:30 static/image/common/back.gif
额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧 ...
是中断处理子程序。就算你没学过也用该知道,程序能够停在那边不往下执行一定是 调用某些代码了 ,这些代码将使用堆栈,从而破快你 原来的数据。
页:
[1]