. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  出栈问题  [待解决] 回复[ 2次 ]   点击[ 577次 ]  
huige
[帖 主]   [ 发表时间:2008-05-02 22:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-15 23:01
我用debug执行出栈指令后查看栈中被弹出数据的位置发现那里的数据并不像书中说的“pop 操作前的栈顶元素依然存在,但是,它已不在栈中。”而是发生了变化,变成了pop操作前的sp-2处的值,相当于出栈指令把当前栈顶的值弹了出去,然后前面的所有元素向后平移两个字节来覆盖以前的内容。就好像排队的时候中间一个人出去后,他后面的所有人往前移了一位。(其实在进栈时像是中途一个人插队使得后面的人同时向后移一位)。反正是我在xp下cmd中调试的,不知是对是错,书中是错的吗?
crazyman
[第1楼]   [ 回复时间:2008-05-03 13:20 ]   [引用]   [回复]   [ top ] 
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26
你看到的现象没有问题。但是,你是在debug下用T命令看的,T是一个中断,而中断的时候会使用当前栈空间存放cs,ip和标志寄存器,这些数据只要你是在debug,每次T都会重新写入栈的,所以,你看见每次pop,这些数据就会移动两个字节的位置。
书上说的是没有问题的,pop操作后,栈顶的元素依然存在,只是不在栈中,就不在受保护了,会被覆盖什么的了。
你不用debug,自己去按照书上的讲解分析一下就知道了,debug下T单步等中端程序的调用就会是栈中的数据有些必然的变化,这就是你观察到的现象的原因。
在以后的学习过程中会慢慢了解清楚的。
huige
[第2楼]   [ 回复时间:2008-05-03 19:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-15 23:01
谢谢阿
这么一说似乎明白了,看来更要努力往后学了,估计在回头的时候会更清楚些。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved