注册 登录
编程论坛 汇编论坛

【求助】栈段初始化的为问题

霞舞轻尘 发布于 2015-01-19 11:02, 4788 次点击
汇编新手,高手勿笑。代码如下:
程序代码:

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 编辑 ]
8 回复
#2
hu9jj2015-01-20 14:37
最后的76 14-00 应该是栈段寄存器的值,00 03则是偏移值。因为你在使用debug调试时,debug程序本身也在使用栈保存数据。
#3
霞舞轻尘2015-01-21 11:29
你的意思是debug程序使用的栈与被调试程序使用的栈是重叠的?那简直就是灾难啊
#4
hu9jj2015-01-22 19:23
除非使用虚拟机,才可能不会真正使用CPU的栈寄存器。
#5
朱大哥2015-01-29 15:45

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 编辑 ]
#6
朱大哥2015-01-29 15:53
回复 2楼 hu9jj
你也瞎搞
#7
hu9jj2015-01-31 20:15
愿听其详
#8
wmf20142015-01-31 21:50
用winhex查看的结果如下:
只有本站会员才能查看附件,请 登录

可以看到64字节已经初始化了,浮动代码的exe文件加载时必须指定ss:sp的值,被改动的那两个字节就应该是debug改动的,后面的那10个字节的改动也是debug单步时使用的,不过最后debug都把sp的值还原到栈底部40的值了,对你以后的栈操作没有影响。换句话说,你对栈初始化某一个值无意义。
#9
取名字2015-05-02 16:52
    对于楼主的第一个问题:为什么栈段最后两个字节未初始化为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 编辑 ]
1