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

小弟实在没有分了,有一个小程序,请高手帮忙改一下哦

楼主DingYugao(小高)2006-06-02 03:14:56 在 其他开发语言 / 汇编语言 提问

小弟实在没有分了,有一个小程序,编译时出现out   of   memory,请高手帮忙改一下哦,顺便帮我写一注释哦,我看不太懂~~~~  
  cursor     equ           45H  
  attrib     equ           2fh  
  code         segment  
                  assume   cs:code,ds:code  
  start:      
                  jmp           go  
  oldcur     dw             ?  
  OLD1C       DW             2   DUP(?)  
  NEWINT1C:  
                  PUSHF  
                  CALL   DWORD   PTR   CS:OLD1C                  
                  push         ax  
                  PUSH         BX  
                  PUSH         CX  
                  PUSH         DX                                            
                  XOR           BH,BH  
                  MOV           AH,3  
                  INT           10H                                                              
                  MOV           CS:OLDCUR,DX  
                  MOV           AH,2  
                  xor           bh,bh  
                  MOV           DX,CURSOR  
                  INT           10H  
                  MOV           AH,2     ;读取系统时钟  
                  INT           1AH                            
                  PUSH         DX                              
                  PUSH         CX  
                  POP           BX  
                  PUSH         BX  
                  CALL         SHOWBYTE  
                  CALL         SHOWCOLON  
                  POP           BX  
                  XCHG         BH,BL  
                  CALL         SHOWBYTE  
                  CALL         SHOWCOLON  
                  POP           BX  
                  CALL         SHOWBYTE  
                  MOV           DX,CS:OLDCUR  
                  MOV           AH,2  
                  XOR           BH,BH  
                  INT           10H  
                  POP           DX  
                  POP           CX  
                  POP           BX  
                  POP           AX  
                  IRET  
  SHOWBYTE   PROC   NEAR  
                  PUSH         BX  
                  MOV           CL,4  
                  MOV           AL,BH  
                  SHR           AL,CL  
                  ADD           AL,30H  
                  CALL         SHOW  
                  CALL         CURMOVE  
                  POP           BX  
                  MOV           AL,BH  
                  AND           AL,0FH  
                  ADD           AL,30H  
                  CALL         SHOW  
                  CALL         CURMOVE  
                  RET  
  SHOWBYTE   ENDP  
   
  SHOWCOLON   PROC   NEAR  
                  MOV           AL,':'  
                  CALL         SHOW  
                  CALL         CURMOVE  
                  RET  
  SHOWCOLON   ENDP  
   
  CURMOVE   PROC   NEAR  
                  PUSH         AX  
                  PUSH         BX  
                  PUSH         CX  
                  PUSH         DX  
                  MOV           AH,3  
                  MOV           BH,0  
                  INT           10H  
                  INC           DL  
                  MOV           AH,2  
                  INT           10H  
                  POP           DX  
                  POP           CX  
                  POP           BX  
                  POP           AX  
                  RET  
  CURMOVE   ENDP  
   
  SHOW         PROC   NEAR  
                  PUSH         AX  
                  PUSH         BX  
                  PUSH         CX  
                  MOV           AH,09H  
                  MOV           BX,attrib  
                  MOV           CX,1  
                  INT           10H  
                  POP           CX  
                  POP           BX  
                  POP           AX  
                  RET  
  SHOW         ENDP  
   
  GO:  
                  PUSH         CS  
                  POP           DS  
                  MOV           AX,351CH                       ;取中断向量  
                  INT           21H  
                  MOV           OLD1C,BX      ;保存原中断向量  
                  MOV           BX,ES  
                  MOV           OLD1C+2,BX  
                  MOV           DX,OFFSET   NEWINT1C ;置新的中断向量  
                  MOV           AX,251CH  
                  INT           21H  
                  MOV           DX,OFFSET   GO  
                  SUB           DX,OFFSET   START  
                  MOV           CL,4  
                  SHR           DX,CL  
                  ADD           DX,11H  
                  MOV           AX,3100H       ;结束并驻留  
                  INT           21H  
  CODE   ENDS  
                  END   START  
  问题点数:20、回复次数:13Top

1 楼DingYugao(小高)回复于 2006-06-02 03:45:54 得分 0

终于编译通过了,但是我在win2003里运行出现提示NTVDM   遇到一个硬错误,这个要怎么解决呢,是怎么会事呢.汗~~~~~~Top

2 楼zara(Kyrie eleison)回复于 2006-06-02 06:40:01 得分 0

在   assume   语句后加上   org   100h   语句,   将程序做成   .com   格式的文件再试试Top

3 楼DingYugao(小高)回复于 2006-06-02 13:38:32 得分 0

按照上面的说法做成了.com文件了  
  可以运行了  
  但是请问com和exe文件有什么区别呢,为什么exe的就不能运行呢Top

4 楼zara(Kyrie eleison)回复于 2006-06-02 13:44:56 得分 0

在载入内存后,   com   是从   PSP   开始编址的,   所以有开始   org   100h   语句,   (前面的   100h   字节就是   PSP   部分).   但   exe   文件就不是,   如果代码段前还有其它数据段的话,   情况会更糟更复杂.   因此,   一般地,   只要有可能就会把驻留型的程序写成   com   格式,   其驻留地址的计算比较简单,   只要直接运算需要驻留到的标号就可以了.   如果是   exe   的话,   就要复杂得多,   除了代码段内的这个驻留部分外,   还需要再加上   PSP   的   100h   字节,   如果前面有需要的数据段的话,   也需要再加上.Top

5 楼DingYugao(小高)回复于 2006-06-03 18:36:17 得分 0

MOV           CL,4  
                  SHR           DX,CL  
                  ADD           DX,11H  
  请问为什么这里的11H呢Top

6 楼zara(Kyrie eleison)回复于 2006-06-03 19:11:03 得分 0

11h,   其中的   10h   (节,   Para.s)   即   100h   字节为为了包括   PSP   的,   另外的   1   节即   10h   自己是为代码段的最后不足   1   节而被   shr   指令去掉的那个节补足的.   这样计算的话,   不是必须创建为   com   格式的文件才可以的.   刚才试了你原来的代码,   作为   exe   格式时,   在   xp/sp2   下也是正常的,   不知道你开始说的在   2003   中的错误是什么Top

7 楼DingYugao(小高)回复于 2006-06-03 21:28:45 得分 0

在2003里运行exe文件是这样的:  
  NTVDM遇到一个硬错误!  
  "不是必须创建为   com   格式的文件才可以的"这就话不太清楚哦  
  Top

8 楼DingYugao(小高)回复于 2006-06-04 04:19:33 得分 0

call   dword   ptr   cs:old1c  
  请问为什么要一句呢,?:Top

9 楼zara(Kyrie eleison)回复于 2006-06-04 07:14:22 得分 0

不是必须创建为   com   格式的文件才可以的,   就是按照定楼的代码生成的   .exe   格式的程序,   也是可以正常运行的.   我在   xp/sp2   下试过的.   不明白为什么   2003   下的错误信息.    
  call   dword   ptr   cs:old1c,   这个是调用原来的中断   1ch   以实现原中断的功能.   自己接管某个中断时,   一般度需要这么做,   不然的话原中断功能不能完成可能会导致意外Top

10 楼DingYugao(小高)回复于 2006-06-04 12:43:00 得分 0

那为什么要   dword   ptr呢Top

11 楼zara(Kyrie eleison)回复于 2006-06-04 13:43:51 得分 0

双字,   CS:IP,   远指针调用Top

12 楼DingYugao(小高)回复于 2006-06-04 16:40:05 得分 0

不好意思哦  
  再问一下,为什么要用双字呢Top

13 楼zara(Kyrie eleison)回复于 2006-06-04 17:54:46 得分 0

双字就是完整的   段+偏址   的寻址模式,   这个是由需要表示的地址范围和寻址方式决定的.Top

相关问题

关键词

得分解答快速导航

  • 帖主:DingYugao

相关链接

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

广告也精彩

反馈

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