CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

一道难题,思考了n久

楼主fangge(fangge)2006-02-03 17:32:55 在 其他开发语言 / 汇编语言 提问

assume     cs:code      
  code     segment      
                        dw     0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H      
                        dw     0,0,0,0,0,0,0,0      
  start:                         mov     ax,cs      
                        mov     ss,ax      
                        mov     sp,32      
                        mov     bx,0      
                        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      
  程序运行结果:      
  -d     cs:0      
  0B51:0000     87     09     BA     0C     ED     OF     EF     0D-13     3E     4F     03     00     00     00     00      
  0B51:0010     00     00     00     00     00     00     41     0B-5C     05     48     00     41     0B     12     72      
  ...      
     
  程序的目的是想让数据0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H逆序存放  
  结果没有安逆序存放,问题会出在哪里呢?      
  我的运行环境:wxp     sp2+masm611,  
  问题点数:100、回复次数:6Top

1 楼zara(Kyrie eleison)回复于 2006-02-03 19:39:31 得分 0

我在   2k   下是正常的.   只是,   最好不要在程序里面进行单步调试,   因为,   你的堆栈较小,   很容易就溢出到数据区部分,   从而破坏掉那里的数据.   应该在执行时一气呵成:   g   46,   46   是   int21h   的指令的地址  
   
  -D   CS:0   L   20  
  0B4A:0000     23   01   56   04   89   07   BC   0A-EF   0D   ED   0F   BA   0C   87   09       #.V.............  
  0B4A:0010     00   00   00   00   00   00   00   00-00   00   00   00   00   00   00   00       ................  
  -G   46  
   
  AX=4C00     BX=0010     CX=0000     DX=0000     SP=0020     BP=0000     SI=0000     DI=0000  
  DS=0B3A     ES=0B3A     SS=0B4A     CS=0B4A     IP=0046       NV   UP   EI   PL   NZ   AC   PO   NC  
  0B4A:0046   CD21                     INT           21  
  -D   CS:0   L   20  
  0B4A:0000     87   09   BA   0C   ED   0F   EF   0D-BC   0A   89   07   56   04   23   01       ............V.#.  
  0B4A:0010     87   09   BA   0C   ED   0F   EF   0D-00   00   46   00   4A   0B   58   05       ..........F.J.X.Top

2 楼fangge(fangge)回复于 2006-02-03 20:50:24 得分 0

谢谢!  
  按照你的调试方法试了一下成功了,  
  可是有个疑问,单步调试的时候会占用栈的空间吗?如果是,又是什么占用了栈的空间呢?Top

3 楼zara(Kyrie eleison)回复于 2006-02-04 09:22:34 得分 60

单步调试时是可能会占用用户程序的堆栈空间的,   具体占用的大小和调试程序还有关系.   所用到的空间一是中断时的压栈信息   (标记寄存器,   返回的远地址),   还有就是调试程序可能直接使用用户的堆栈空间来保存些信息,   比如对使用到的寄存器进行   push   保护,   结束时   pop   恢复等等.     在你的这个程序中,   实际的堆栈空间是   cs:0010   -   cs:001f.   在数据压栈之后再回存时,   单步中断的话,   就可能会占用到前面部分的空间Top

4 楼fangge(fangge)回复于 2006-02-04 11:27:31 得分 0

这么说,如果把栈的空间设置大点,单步调试的时候就没有问题了吗?Top

5 楼VxD1(Dump)回复于 2006-02-04 11:32:59 得分 40

dw     0123H,0456H,0789H,0abcH,0defh,0fedh,0cbah,0987H      
                        dw     中间加些空间应该就没事了  
                        dw     0,0,0,0,0,0,0,0Top

6 楼zara(Kyrie eleison)回复于 2006-02-04 12:20:38 得分 0

栈空间加大就可以的,   但是除了在   VxD1   所说的中间再加些之外,   mov     sp,32   这一句也应该作调整Top

相关问题

  • 问个思考N久的问题--散分!!
  • 真的没人会这道难题吗,已经N天了.......
  • 急救,n-up窗口排列顺序难题
  • =========难题。难题======
  • Delphi难题,高手请进,难难难!N天了,没人能回答!!!
  • 不知道是不是难题:随意n项之和唯一的数列?
  • 难题:在ORACLE里如何取得某条记录的前N条记录或后N条记录???????
  • 难题:在ORACLE里如何取得某条记录的前N条记录或后N条记录???????
  • 难题!难题!难题!
  • 一个思考很久的问题

关键词

  • code
  • bx
  • cs
  • 程序
  • ax
  • mov
  • cx
  • sp

得分解答快速导航

  • 帖主:fangge
  • zara
  • VxD1

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo