论坛: 编程破解 标题: 菜鸟汇编求助 复制本贴地址    
作者: jzit_wmm [jzit_wmm]    论坛用户   登录
我在编写一个中断程序,但运行不了,请斑竹和各位大虾看一下!!!!

data SEGMENT
intoff DW ?
intseg DW ?
intmsg DB 'i fuck you,i can fly'
      DB 0dh,0ah,0
data ENDS
                                                     
code SEGMENT
      ASSUME CS:code ,DS:data
start: MOV AX,code
      MOV DS,AX
      MOV AX,3580h
      INT 21h
      MOV intoff,BX
      MOV intseg,ES
      PUSH DS
      MOV DX,OFFSET new80h
      MOV AX,SEG new80h
      MOV DS,AX
      MOV AX,2580h
      INT 21h         
      INT 80h

                     
new80h PROC   
      STI 
      MOV  AX,data
      MOV  DS,AX
      MOV DX,OFFSET intmsg                           
      PUSH AX
      PUSH BX             
      PUSH SI
      MOV SI,DX
new1:  MOV AL,[SI]
      CMP AL,0
      JZ  new2
      MOV BX,0
      MOV AH,0Eh
      INT 10H
      INC SI
      JMP new1
             
new2:  POP SI
      POP BX
      POP AX     
      IRET
new80h    ENDP         
         
      POP DS     
      MOV DX,intoff
      MOV AX,intseg
      MOV DS,AX
      MOV AX,2580h
      INT 21h
      MOV AH,01
      INT 21h 
code ENDS
END start


地主 发表时间: 05-04-12 13:03

回复: 286 [unique]   版主   登录
这是早期的TSR程序,也就是中断驻留程序。早期DOS是个单用户单任务的操作系统。
运行一个程序,系统就把CPU使用权给该程序,该程序运行完,把权力又给了系统,并且系统把该程序占的资源回收,而TSR则在退出后不回收,挂到某个中断上,当这个中断被触发时,就得到运行。

你的程序我没时间看,不过看上去,结构是没错。我不知道你说的运行不了是哪方面的运行不了。是编译不通过,还是通过了到不了自己设想的结果。
如果是前者,过两天或别的人帮他看看。如果是后者,原因是这样的:WINDOW是多用户操作系统,其中的DOS方式也仅是WINDOWS的一个虚拟机,所以你打开一个DOS窗口,然后运行TSR,只要这个窗口不关,TSR还是存在,有些(注意是有些)程序可以正常。但一旦你关掉就没了。

所以要调这类程序,你需要在一个纯净DOS系统,这个纯DOS有两种方法,一种是你用98制作一张安装盘,另一种是启动时选DOS模式。


B1层 发表时间: 05-04-12 17:22

回复: jzit_wmm [jzit_wmm]   论坛用户   登录
这段 中断程序 连接,编译都通过了,但运行后,屏幕一闪,窗口自动关闭。
我尝试着 把 new80h中的 返回指令 iret 去掉后,屏幕 显现期望中的 字符,但一按 any key
出现如下对话框:
16位MS-DOS 子系统
c:\visulasm\mywork\1.exe
NTVDM CPU 遇到无效指令。
CS:0557 IP:8bb3 OP:63 68 2d 70 61 选择‘关闭’终止应用程序。
           
                  关闭      忽略

原来程序中 的 pop DS 在start 中到数 第二行,我把它移动到  new80h  endp 下的 第一行,
没有移动 之前,编译连接,运行后,出现相同的 对话框,但CS,IP  OP的值不同。


[此贴被 jzit_wmm(jzit_wmm) 在 04月12日22时58分 编辑过]

B2层 发表时间: 05-04-12 22:36

回复: 286 [unique]   版主   登录
首先,你说的现象应该是TSR正常现象。
因为TSR程序不是执行某一功能,而是运行后留到内存中,并修改某个中断,当这个中断被触发时(说的通俗点,就是有人调用这个中断时)中断程序部分才得到运行。

B3层 发表时间: 05-04-13 09:08

回复: jzit_wmm [jzit_wmm]   论坛用户   登录
谢谢斑竹,但我仍有疑惑,我已经 用 int 80h 调用中断程序了,为何没结果,我去掉iret后,反而有了结果??

B4层 发表时间: 05-04-14 18:07

回复: 286 [unique]   版主   登录
你在DOS方式下,提示行中运行前者,然后再运行后面调用部分。不要通过双击运行,因为双击时,两个程序运行的DOS环境不是同一个。

去掉IRET,该中断就没有返回了。

B5层 发表时间: 05-04-15 09:16

回复: jzit_wmm [jzit_wmm]   论坛用户   登录
 
这个程序我用 visualasm 编译连接都通过,但运行不了。根本不生成 obj文件和exe文件。
我用masm5,根本没消息,也不说对,也不说错,更没生成 文件!!!!

B6层 发表时间: 05-04-15 19:32

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号