l13127131w 发表于 2016-3-6 21:43:00

压栈、出栈的问题

本帖最后由 l13127131w 于 2016-3-7 16:44 编辑

理论如下

其实pop取出的时候,数据还是存在栈中(也就是两个内存单元中),内存单元数据不提供删除机制,只是指针变了,下次push时会覆盖。

这就是为什么硬盘格式化后可以恢复,格式化只是更改硬盘前面的索引而已。

上面的话是小甲鱼视频教程里面原话。

意思就是数据出栈后在没有新的数据进栈前它在内存单元中的值没变。

实验如下

汇编语言第六章6.2,利用栈,将程序中定义的数据逆序存放。

虽然8个字型顺序是逆序了,也没新数据入栈,但是出栈后,原来栈中内容却变了,是这为什么???

-g 0053是 mov ax,4c00h的偏移地址;
实验中我发现执行mov ss,ax和mov sp,30h的时候,虽然没压栈其实栈中数据就变了。

SA突袭 发表于 2016-3-7 10:54:27

是中断机制,在后面会学习的,调用mov ss,ax和mov sp后就会出现

n0noper 发表于 2016-3-7 11:02:00

刚搜了一下,可能是Debug软件的问题,它也在用这一部分内存。撸主测试一下定义一个堆栈segment(大一点或小一点),然后再试试。 如果有结论,求回复!让我们也开开眼{:10_250:}

l13127131w 发表于 2016-3-7 13:24:34

n0noper 发表于 2016-3-7 11:02
刚搜了一下,可能是Debug软件的问题,它也在用这一部分内存。撸主测试一下定义一个堆栈segment(大一点或小 ...

现在栈是16个字节,-g 0043是 mov ax,4c00h的偏移地址。注意红色框里面出栈后,不一样。
看了别的帖子,2楼应该是正解。先放到这吧,学到中断机制再回头。

n0noper 发表于 2016-3-7 13:30:44

l13127131w 发表于 2016-3-7 13:24
现在栈是16个字节,-g 0043是 mov ax,4c00h的偏移地址。注意红色框里面出栈后,不一样。
看了别的帖子 ...

现在你还没调用21H中断···关中断什么事?中断类似其他语言的函数,怎么会还没执行就私自修改内存数据?
还有,我说的栈是系统最大给你的,不是你自己申请的,你变量中申请了16字节,但是你push大于16字节也会正常压入,因为你可以使用64K大小的栈空间。
我上边的意思:你pop以后,原数据被覆盖了,是被Debug这个软件自己运行的数据覆盖了。

l13127131w 发表于 2016-3-7 16:44:03

本帖最后由 l13127131w 于 2016-3-7 16:50 编辑

n0noper 发表于 2016-3-7 13:30
现在你还没调用21H中断···关中断什么事?中断类似其他语言的函数,怎么会还没执行就私自修改内存数据 ...

其实在mov ax,cs的时候,-t执行对ss和sp操作的时候,我发现栈中的值就变了(这个你看我上传的第三张图)

并不是在pop时候才发生变化。

asm在虚拟机里面,怎么都复制不出来。我手敲一遍给你。

assume cs:code

code segment
   
               dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

               dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

      start:mov ax,cs
                mov ss,ax
                mov sp,30h

             s:push cs:
                add bx,2
                loop s

                mov bx,0
                mov cx,8

            s0:pop cs:
                add bx,2
               loop s0

         mov ax,4c00h
         int    21h4

code ends

end start

n0noper 发表于 2016-3-8 08:22:42

l13127131w 发表于 2016-3-7 16:44
其实在mov ax,cs的时候,-t执行对ss和sp操作的时候,我发现栈中的值就变了(这个你看我上传的第三张图 ...

-t单步调试的时候,DEBUG软件调用了系统中断(上边我说错了,我理解成应用程序调用中断了···对不起),然后pushf / push cs / push ip 一系列操作,就把你的堆栈区数据修改掉了。这时DEBUG软件的问题,他也要使用你申请的堆栈空间。每一次单步调试都要使用,所以每一次都会改变,你可以试一下,注意-d查看的时候看得多一点。

l13127131w 发表于 2016-3-9 23:28:58

n0noper 发表于 2016-3-8 08:22
-t单步调试的时候,DEBUG软件调用了系统中断(上边我说错了,我理解成应用程序调用中断了···对不起), ...

谢谢你的热心回答

l13127131w 发表于 2016-3-9 23:29:29

SA突袭 发表于 2016-3-7 10:54
是中断机制,在后面会学习的,调用mov ss,ax和mov sp后就会出现

谢谢

SA突袭 发表于 2016-3-13 22:23:08

l13127131w 发表于 2016-3-9 23:29
谢谢

不谢,我也没看到那里

SA突袭 发表于 2016-3-13 22:23:40

l13127131w 发表于 2016-3-9 23:29
谢谢

不谢,我也没看到那里

兰陵月 发表于 2016-3-14 11:40:09

n0noper 发表于 2016-3-8 08:22
-t单步调试的时候,DEBUG软件调用了系统中断(上边我说错了,我理解成应用程序调用中断了···对不起), ...

你的这个解释基本正确,书里也说了,这是中断机制造成,但并不是人为程序控制的中断,而是系统自己的中断导致的。
页: [1]
查看完整版本: 压栈、出栈的问题