| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7718 人关注过本帖
标题:关于王爽检测点6.1(2)栈的问题(求解惑)
只看楼主 加入收藏
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:6 
关于王爽检测点6.1(2)栈的问题(求解惑)
要求:用内存0:0-0:15的内容改写程序中的数据,数据用栈传送并且栈空间设置在程序段。程序如下(来自答案)

assume cs:code
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  ;这是要修改的内容(16个字节)
dw 0,0,0,0,0,0,0,0,0,0                              ;定义20个字节的栈空间
start: mov ax,cs
       mov ss,ax
       mov sp,36                                    ;设置cs:sp指向栈顶,这也是小弟的疑问所在,我自己的理解是:程序原来
                                                    ;的数据段和栈空间加起来一共是36个字节,不是应该0-35么?按照栈以字单
                                                    ;元存放来说,栈顶难道不是34么?即使栈能以字节存放,那栈顶应该是34吧
                                                    ;,为什么是36呢?我知道肯定是自己哪里理解错了,求各位指出,感激万分
       mov ax,0
       mov ds,ax
       mov bx,0
       mov cx,8

s:     push [bx]
       pop cs:[bx]
       add bx,2
       loop s

       mov ax,4c00h
       int 21h
code ends
end start
搜索更多相关主题的帖子: start 检测 空间 
2015-12-28 02:41
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
收藏
得分:0 
回复 楼主 Kristian_Tam
错了,我的意思是说如果栈以字节存放,那栈顶应该也是35吧,到底我哪里理解错了?
2015-12-28 03:50
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:15 
楼主可以这样理解:一个桶相当于栈,桶盖的位置就是栈指针。
当栈执行push指令时,栈指针先自减,再压入数,执行pop指令时,先取出数,在栈指针自加。

能编个毛线衣吗?
2015-12-28 08:40
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
收藏
得分:0 
回复 3楼 wmf2014
谢谢回复,我的理解是36个字节不是应该0-35么?当栈为空的时候,指针应该指向第35号单元啊,怎么是36呢?如果是0-36的话,那该程序的数据和栈空间加起来不是37个字节了么?
2015-12-28 08:51
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 4楼 Kristian_Tam
如果按你那样做的话,intel公司需要重新设计微指令,就是先压入数据,栈指针再自减。
多数情况下,栈的当前位置必须指向一个有效数,而有效数就是刚刚压入的数据,如果按你的理解指向,则由于位置35没有压入数据,则栈当前指向的是一个非有效值。

能编个毛线衣吗?
2015-12-28 10:46
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:5 
你确定 “设置cs:sp指向栈顶” 这种说法没有问题?

The following is a summary of special uses:
EAX — Accumulator for operands and results data
EBX — Pointer to data in the DS segment
ECX — Counter for string and loop operations
EDX — I/O pointer
ESI — Pointer to data in the segment pointed to by the DS register; source pointer for string operations
EDI — Pointer to data (or destination) in the segment pointed to by the ES register; destination pointer forstring operations
ESP — Stack pointer (in the SS segment)
EBP — Pointer to data on the stack (in the SS segment)
2015-12-28 13:50
Kristian_Tam
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-16
收藏
得分:0 
理解了,感谢楼上两位,正如八画小子说的,“设置ss:sp指向栈顶”本身就有问题。再如wmf2014所说,指针必须指向一个有效值,那么既然是空栈的状态指针必定是在栈空间外,否则也就没有“空栈”一说了。再次感谢两位赐教
2015-12-29 11:07
快速回复:关于王爽检测点6.1(2)栈的问题(求解惑)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059050 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved