暗pluto 发表于 2019-2-21 17:49:24

关于汇编的一道题

assume cs:code

code segment
       
        dw 0123h,0456h,0789h,0abch,0bceh,0888h,0999h,0eeeh
        dw 0,0,0,0,0,0,0,0
       
       
start:        mov ax,cs
                mov ss,ax
                mov bx,0
                mov sp,32
                mov cx,8
        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 21h
                code ends
                end start

如题,这个程序是把数倒过来存放,答案是正确的,但结果让我很不解,就是,为什么最后的16~32个字节单元中的数据会改变,明明没有修改操作啊

行客 发表于 2019-2-21 17:49:25

暗pluto 发表于 2019-2-21 18:33
对,这个过程我知道,但是问题是程序运行结束后,16~31那16个字节中的数为什么不是我按顺序放下去的数, ...

你是否使用了单步中断?

debug载入并运行程式时,下达t,p或g等指令时,会短暂的借主程式的栈以作暂存之用。比如 [保存] 主程式的cs,ip或flag等值。

这就是原因。

jackz007 发表于 2019-2-21 18:16:56

本帖最后由 jackz007 于 2019-2-21 18:40 编辑

       mov sp , 32 把栈顶指针指向了 cs : 32, 这样,从 cs : 0 ~ 31 共 16 个 word 的内存区域被平分为两个部分,其中,前一半 cs : 0 ~ 15 为数据区,后一半 cs : 16 ~ 31 为堆栈区。程序中的 push cs: 每执行一次,cs: 的 2个字节就会被存入 cs : sp 所指向的 2 个字节的内存(堆栈),sp 就会相应减 2,执行完 loop s 指令,cs : 0 ~ 15 的总共 8 个 word 的内容就会全部存入堆栈,也就是内存 cs : 16 ~ 31 的区域。
      
       程序接下来又把堆栈中的全部 8 个 word 的内容顺序取出,依次存入 cs:0 ~ 15 的内存区域,看上去虽然和前面存入堆栈的顺序完全一样,但是,由于堆栈先进后出的特性,所以,最先被取出的是最后入栈的那个 word,最后被取出的是最先入栈的 word,这样,原来 cs:0 ~ 15 区域的 8 个 word 就实现了首位对调的效果。   

暗pluto 发表于 2019-2-21 18:33:48

jackz007 发表于 2019-2-21 18:16
mov sp , 32 把栈顶指针指向了 cs : 32,push cs: 每执行一次,cs: 的 2个字节就会被存入 cs : sp...

对,这个过程我知道,但是问题是程序运行结束后,16~31那16个字节中的数为什么不是我按顺序放下去的数,而是一堆奇奇怪怪的数据

暗pluto 发表于 2019-2-21 19:14:58

行客 发表于 2019-2-21 19:08
你是否使用了单步中断?

debug载入并运行程式时,下达t,p或g等指令时,会短暂的借主程式的栈以作暂存 ...

中断还没学到,是因为使用了t,p或g指令导致的吗,那有没有办法使其不改变而又能查看内存数据的方法或指令呢?

行客 发表于 2019-2-21 19:23:04

暗pluto 发表于 2019-2-21 19:14
中断还没学到,是因为使用了t,p或g指令导致的吗,那有没有办法使其不改变而又能查看内存数据的方法或指 ...

是的,是因为这个原因。目前我暂时还没有找到什么办法,因为调试状态下,没办法不使用中断命令。

行客 发表于 2019-2-21 19:27:41

别纠结了,知道原理就可以了。不用调试没办法查看实时变化;一下执行结束整个缓冲区都可能会发生变化。

不过也可以有办法,就是再写一个程序实时监测内存变化做记录。不过这是不是把事情搞复杂了啊

暗pluto 发表于 2019-2-21 20:45:46

行客 发表于 2019-2-21 19:27
别纠结了,知道原理就可以了。不用调试没办法查看实时变化;一下执行结束整个缓冲区都可能会发生变化。

...

谢谢了,就是想搞明白为什么变了,不过现在知道原因了就没那么纠结了

新手zz 发表于 2019-2-21 21:28:08

没看懂

暗pluto 发表于 2019-2-21 23:13:50

新手zz 发表于 2019-2-21 21:28
没看懂

你得先看得懂汇编,不然你不知道我在说什么的
页: [1]
查看完整版本: 关于汇编的一道题