. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于出栈的一个小问题  [待解决] 回复[ 4次 ]   点击[ 283次 ]  
wyp12
[帖 主]   [ 发表时间:2009-09-07 18:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-06 21:06
assume cs:codesg 
codesg segment 
mov ax,2000h 
mov ss,ax 
mov sp,0 
add sp,10 
pop ax 
pop bx 
push ax 
push bx 
pop ax 
pop bx 
mov ax,4c00h 
int 21h 
codesg ends 
end


前三行分配了堆栈空间,SP=10.
我并没有数据入栈,
为什么就能POP ax?
是否堆栈越界了?
wsrf
[第1楼]   [ 回复时间:2009-09-08 10:26 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
你可以把任意一段空间作为栈空间,你没有进行入栈操作,并不代表此段内存中就没有数据,而实际上此段内存空间是始终有数据存在的。只是对你的程序来说,栈中的数据是无效的,是可以任意修改的。
SP是用来指向栈顶的,而内存单元是用来存放数据的,你可以指定任何一个子单元为栈顶,即只要把SP赋值为子单元的起始地址即可,但是内存中数据是始终存在的。只是说如果你把SP指向了特定位置,比如指向的位置的数据是当前系统所必须的,如果你此时进行入栈操作,便会把数据改变,从而影响到系统的正常运行。而出栈操作只是对数据进行读取,其它用到此数据的程序不会受影响。
wyp12
[第2楼]   [ 回复时间:2009-09-11 01:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-06 21:06
谢谢,和我们老师说的一样。
------------------
回复:
chen19910919
[第3楼]   [ 回复时间:2009-09-13 11:45 ]   [引用]   [回复]   [ top ] 
荣誉值:15
信誉值:0
注册日期:2009-07-08 20:35
二楼说得对,我觉得问题是楼主没有认真看书吧,书里面写得可是很清楚的诶,说实话我很看好这本书
wnfzy-126
[第4楼]   [ 回复时间:2009-09-28 14:52 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-08-22 20:30
wsrf说的正确,继续努力!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved