| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4788 人关注过本帖
标题:【求助】栈段初始化的为问题
只看楼主 加入收藏
霞舞轻尘
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-12-12
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
【求助】栈段初始化的为问题
汇编新手,高手勿笑。代码如下:
程序代码:
assume  cs:code,ds:data,ss:stack
stack   segment    stack            
        db    64    dup(11H)
stack   ends
data    segment    
        a    dw    1245H
data    ends
code    segment    
start:
        mov        ax,stack        ;栈段初始化
        mov        ss,ax
        mov        sp,offset stack    ;设置栈顶
            
        mov        ax,data    
        mov        ds,ax

        pop        dx
        push       a
        pop        bx
        push       ds:[0]
        pop        cx

        mov        ax,4c00H        ;退出程序
        int        21H
code    ends
end     start

本人系统:win7 32位,用系统自带debug调试,刚进入调试画面,查看ss:0数据,截图如附件:
为什么栈段最后两个字节未初始化为11H?另外执行第一条指令“mov ax,stack”以后栈段最后10个字节数据改变,为什么?
另外,代码段前三条代码是否多余,程序在加载如内存中的时候有系统自动设置SS:SP的值?
请高手解答啊,不胜感激
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 霞舞轻尘 于 2015-1-19 11:03 编辑 ]
搜索更多相关主题的帖子: color 
2015-01-19 11:02
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:20 
最后的76 14-00 应该是栈段寄存器的值,00 03则是偏移值。因为你在使用debug调试时,debug程序本身也在使用栈保存数据。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-01-20 14:37
霞舞轻尘
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-12-12
收藏
得分:0 
你的意思是debug程序使用的栈与被调试程序使用的栈是重叠的?那简直就是灾难啊
2015-01-21 11:29
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
除非使用虚拟机,才可能不会真正使用CPU的栈寄存器。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-01-22 19:23
朱大哥
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:72
专家分:123
注 册:2015-1-16
收藏
得分:0 

16位寻址机制都弄不明白 就拿调试器说话  瞎搞
栈寻址机制呀
SS*16+SP
assume  cs:code,ds:data,ss:stack
stack   segment    stack           
        db    64    dup(11H)
stack   ends
data    segment  
        a    dw    1245H
data    ends
code    segment  
start:
        mov        ax,stack        ;栈段初始化
        mov        ss,ax              -------------》这个位置已经指定栈的数据空间
        mov        sp,offset stack    ;设置栈顶-------------->你吧这个地方改成mov sp,0,再去调试
           
        mov        ax,data  
        mov        ds,ax
        pop        dx
        push       a
        pop        bx
        push       ds:[0]
        pop        cx
        mov        ax,4c00H        ;退出程序
        int        21H
code    ends
end     start


[ 本帖最后由 朱大哥 于 2015-1-29 15:51 编辑 ]
2015-01-29 15:45
朱大哥
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:72
专家分:123
注 册:2015-1-16
收藏
得分:0 
回复 2楼 hu9jj
你也瞎搞
2015-01-29 15:53
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
愿听其详

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-01-31 20:15
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
用winhex查看的结果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

可以看到64字节已经初始化了,浮动代码的exe文件加载时必须指定ss:sp的值,被改动的那两个字节就应该是debug改动的,后面的那10个字节的改动也是debug单步时使用的,不过最后debug都把sp的值还原到栈底部40的值了,对你以后的栈操作没有影响。换句话说,你对栈初始化某一个值无意义。

能编个毛线衣吗?
2015-01-31 21:50
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
    对于楼主的第一个问题:为什么栈段最后两个字节未初始化为11H?最后两个字节的值不知道是什么值,但应该是DEBUG改变的结果。因为程序一载入,堆栈就已经被初始化,程序本身和调试器都可以使用这个堆栈。
    对于楼主的第二个问题:另外执行第一条指令“mov ax,stack”以后栈段最后10个字节数据改变,为什么?这是因为当你在程序中设置了栈段,在DEBUG环境中,DEBUG就会使用你设置的栈段来存储一些运行时的数据。其中的“4A 0E”是标志寄存器的值,“7B 14”是CS代码段寄存器的值,“03 00”是指令指针寄存器IP的值,因为在DEBUG环境下调试程序,是利用单步中断来实现的,而发生中断时,CPU要进行一些现场保护,即将标志寄存器(同时将标志寄存器的TF、IF位置0)、CS代码段寄存器、IP指令指针寄存器的值入栈保存,中断完成后,再弹出以恢复现场。
    对于楼主的第三个问题:另外,代码段前三条代码是否多余,程序在加载如内存中的时候有系统自动设置SS:SP的值?在本程序中,代码段前三条代码确实是多余,因为“stack segment stack”已经告诉系统在载入时初始化堆栈了,所以不需要在程序中多此一举设置了。


[ 本帖最后由 取名字 于 2015-5-2 16:53 编辑 ]
2015-05-02 16:52
快速回复:【求助】栈段初始化的为问题
数据加载中...
 
   



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

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