鱼C论坛

 找回密码
 立即注册
查看: 3058|回复: 9

[已解决]关于汇编的一道题

[复制链接]
发表于 2019-2-21 17:49:24 | 显示全部楼层 |阅读模式
10鱼币
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:[bx]
                add bx,2
                loop s
               
                mov bx,0
                mov cx,8
        s0:        pop cs:[bx]
                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等值。

这就是原因。

最佳答案

查看完整内容

你是否使用了单步中断? debug载入并运行程式时,下达t,p或g等指令时,会短暂的借主程式的栈以作暂存之用。比如 [保存] 主程式的cs,ip或flag等值。 这就是原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-21 17:49:25 | 显示全部楼层    本楼为最佳答案   
暗pluto 发表于 2019-2-21 18:33
对,这个过程我知道,但是问题是程序运行结束后,16~31那16个字节中的数为什么不是我按顺序放下去的数, ...

你是否使用了单步中断?

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

这就是原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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:[bx] 每执行一次,cs:[bx] 的 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 就实现了首位对调的效果。   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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个字节中的数为什么不是我按顺序放下去的数,而是一堆奇奇怪怪的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-21 19:14:58 | 显示全部楼层
行客 发表于 2019-2-21 19:08
你是否使用了单步中断?

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

中断还没学到,是因为使用了t,p或g指令导致的吗,那有没有办法使其不改变而又能查看内存数据的方法或指令呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是的,是因为这个原因。目前我暂时还没有找到什么办法,因为调试状态下,没办法不使用中断命令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不过也可以有办法,就是再写一个程序实时监测内存变化做记录。不过这是不是把事情搞复杂了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

...

谢谢了,就是想搞明白为什么变了,不过现在知道原因了就没那么纠结了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-21 21:28:08 | 显示全部楼层
没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-21 23:13:50 | 显示全部楼层

你得先看得懂汇编,不然你不知道我在说什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表