求 用汇编语言写一个简单的程序 急~!!!

打开文件,查找字符串,将此字符串从文件中删除。。。若没查到则认为没染病毒。。。
二、设计资料及参数
在各种PC机病毒中, 文件型病毒占的数目最大,传播得广。文件型病毒是对源文件进行修改,将病毒加在文件前部或尾部,使其成为新的带毒文件。我们可以通过在文件中进行关键字查找和替换,从而发现和清除病毒。
三、设计要求及成果
1、设计要求:
(1) 对指定文件进行字符串查找操作。
(2) 找到匹配字符串后进行替换操作,替换后保存文件。
(3) 显示替换(清除病毒)成功或没找到(没毒)
2、设计成果:
(1)程序源代码。(2)课程设计说明书。

data segment
VDef db 'viruscode';存放病毒特征码
LenVDef = ($-VDef);病毒特征码长度
RepChar equ <90h>;定义要替换的安全字节,这里90H是NOP指令的机器码,可以换成其他字符
FBuff db 1024 dup(?);文件缓冲区
LenBuff = ($-FBuff);文件缓冲区长度
FileName db 128;用户输入的要查毒的文件名字(可含路径)
db ?
db 128 dup(?)
FileTmp db 'ftmp.tmp',0
hFSrc dw ?
hFTmp dw ?
dwTmp dw ?;定义一个临时变量
msg0 db 'Input FileName:$'
msg1 db 'Open File Error!$'
msg2 db 'Found Virus and Cleaned!$'
msg3 db 'No virus found!$'
menu db '1--Input FileName 2--Scan 3--Exit:$'
data ends

CRLF macro
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
endm

ShowMsg macro x
mov ah,09h
lea dx,x
int 21h
endm

code segment
assume cs:code,ds:data,es:data
FindInStr proc far
;入口参数,形参
;[bp+12]=string2的长度,字
;[bp+10]=string1的长度,字
;[bp+8]=string2的开始地址
;[bp+6]=string1的开始地址

;以下为局部变量
;[bp-2]=string1位置变量,字
;[bp-4]=最大查找次数,字
;出口:AX=如果STR2在STR1中,则为第一次匹配时的位置(在第一个字符为0000H),如果没找到,则为0FFFFH
push bp
mov bp,sp
add sp,-4

mov ax,[bp+10]
cmp ax,[bp+12]
jae @F;判断两个字符串的长度
mov ax,0FFFFH
jmp RetHere

@@:
;局部变量初始化
mov si,[bp+8]
mov di,[bp+6]
mov [bp-2],di
mov ax,[bp+10]
sub ax,[bp+12]
inc ax
mov [bp-4],ax

cld
mov cx,[bp-4]
LP_CMP:
push cx
mov si,[bp+8]
mov di,[bp-2]
mov cx,[bp+12]
repe cmpsb
jne @F
mov ax,[bp-2]
sub ax,[bp+6]
jmp RetHere
@@:
inc word ptr [bp-2]
pop cx
loop LP_CMP

mov ax,0FFFFH
RetHere:
mov sp,bp
pop bp
ret 8
FindInStr endp

ScanVirus proc far
;入口参数:hFSrc存放要扫描的文件句柄
;出口参数:AX=0代表无病毒,AX=1代表有病毒
;局部变量
;[bp-2]=0代表无病毒,=1代表有病毒,字
push bp
mov bp,sp
add sp,-2

mov word ptr [bp-2],0;先将标志初始化为0,无毒

mov ah,3ch
xor cx,cx
lea dx,FileTmp
int 21h;创建临时文件
mov hFTmp,ax

L_ReadFile:
mov ah,3fh
mov bx,hFSrc
mov cx,LenBuff
lea dx,FBuff
int 21h;顺序读取源文件的LenBuff个字节,存到缓冲区

or ax,ax;测试是否已经到达文件尾
jz L_EOF
mov dwTmp,ax;保存实际读取的字节数
@@:
mov ax,LenVDef
push ax
mov ax,dwTmp
push ax
lea ax,VDef
push ax
lea ax,FBuff
push ax
call FindInStr
cmp ax,0FFFFH
jz @F
mov bx,ax
mov word ptr [bp-2],1;有毒
mov al,RepChar
mov cx,LenVDef
cld
lea di,FBuff
add di,bx
rep stosb;杀毒
jmp @B
@@:
;存储无毒的FBuff
mov ah,40h
mov bx,hFTmp
mov cx,dwTmp
lea dx,FBuff
int 21h
jmp L_ReadFile

L_EOF:
mov ah,3eh
mov bx,hFTmp
int 21h;关闭临时文件
mov ax,[bp-2]
mov sp,bp
pop bp
ret
ScanVirus endp

start:
mov ax,data
mov ds,ax
mov es,ax

L_Menu:
CRLF
ShowMsg menu;打印功能菜单

mov ah,01h
int 21h;用户输入选择

cmp al,'1'
jb L_Menu
cmp al,'3'
ja L_Menu

je Done;用户选择退出
cmp al,'1'
jne L_scan

;用户选择输入要查毒的文件
@@:
CRLF
ShowMsg msg0;提示用户输入文件名
mov ah,0ah
lea dx,FileName
int 21h
mov bl,FileName+1
or bl,bl;测试用户是否直接回车,忘记输入文件名
jz @B

xor bh,bh
mov byte ptr FileName[bx+2],0;变成文件名ASCII-Z串
jmp L_Menu

L_scan:
CRLF
mov ah,3dh
mov al,0
lea dx,FileName+2
int 21h;打开源文件

jc L_OpenErr;如果打开文件出错

mov hFSrc,ax
call ScanVirus
or ax,ax
jz L_NoVirus

ShowMsg msg2
mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件
mov ah,3ch
xor cx,cx
lea dx,FileName+2
int 21h;删除有毒源文件,并创建新文件
mov hFSrc,ax
mov ah,3dh
mov al,0
lea dx,FileTmp
int 21h;打开无毒的临时文件
mov hFTmp,ax

;复制文件
@@:
mov ah,3fh
mov bx,hFTmp
mov cx,LenBuff
lea dx,FBuff
int 21h
mov dwTmp,ax
or ax,ax
jz @F
mov ah,40h
mov bx,hFSrc
mov cx,dwTmp
lea dx,FBuff
int 21h
jmp @B
@@:
mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件
mov ah,3eh
mov bx,hFTmp
int 21h;关闭临时文件
mov ah,41h
lea dx,FileTmp
int 21h;删除临时文件
jmp L_Menu

L_NoVirus:
;如果没有病毒
ShowMsg msg3

mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件

mov ah,41h
lea dx,FileTmp
int 21h;删除临时文件
jmp L_Menu

L_OpenErr:

ShowMsg msg1;提示打开文件错误
jmp L_Menu

Done:
mov ax,4c00h
int 21h
code ends
end start
温馨提示:内容为网友见解,仅供参考
无其他回答

用汇编语言编写一个程序
使用汇编语言编写程序实现用户登录功能,包含用户名和密码输入与验证。程序通过结构类型定义用户名和密码信息,并实现输出、获取光标位置、设置光标位置、窗口上滚、输入密码以及用户输入错误处理等功能。主要步骤包括初始化环境、输入用户名、验证用户名、输入密码、验证密码、显示欢迎信息和结束程序。程序首先初始...

简单的汇编语言程序设计!加急!
MOV 32H, 30H MOV A, 30H CLR C SUBB A, 31H ;(30H)-(31H)JC EXIT ;不够减转移 MOV 32H, 31H ;否则31H才是小数 EXIT:END --- 2. 将片内RAM单元中 30H~37H 的数据送到片外RAM的 40H~47H。MOV R0, #30H MOV R1, #40H MOV R2, #8 LOOP:MOV ...

用汇编语言编一个程序
09H INT 21H LOOP LOOP2LABEL1: POP AX PUSH AX ; 计算第 i 行显示字符数 MOV CX, 15 SUB CX, AX INC CXLOOP3: ; 显示 * 号 MOV DX, OFFSET STAR MOV AH, 09H INT 21H LOOP LOOP3 ; 换行 MOV DX, OFFSET LINE MOV AH, 09H ...

用汇编语言编写一个小小程序
这个还不简单#include<stdio.h>void main(){ float a,b,c,s;\/*定义数据类型,数据初始化*\/s=(a*b+c)\/a;\/*计算并把计算结果赋值给s*\/printf("s=%f\\n",s);\/*输出计算结果*\/}

试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来...
程序不是很难,建议你自己写,这题的关键就是一个大小写转换问题,大写字母从41h~5Ah,小写字母从61h~7Ah,规律就是小写字母比大写字母的ASCII码大20h,所以可以用减20h实现小写转换为大写,另外还有一个方法就是,如果注意观察可以发现小写字符ASCII码2进制表示时bit5为1,而大写字母bit5为0,所以...

编一个给小学生出两位数乘法运算题程序;用汇编语言编写,急需……_百 ...
程序采用汇编语言编写,使用8086架构。程序运行流程如下:1. 显示提示,要求输入第一个数,等待用户输入。2. 显示提示,要求输入第二个数,等待用户输入。3. 对输入的数进行处理,计算乘积。4. 显示计算结果。程序中包含输入处理逻辑,能够验证用户输入的合法性。如果输入错误,程序会提示用户重新输入。

汇编语言编写一简单查表程序
MAIN:MOV R5,#0 ;给初值 MOV A,R5;A=0 LP: MOVC A,@A+DPTR ;查表 MOV P1,A; 显示 MOV A,R5 INC A ;加1 MOV R5,A LCALL DELAY ;延时 CJNE A,#10,LP ;是否 到9.SJMP MAIN DELAY:MOV R3,#255 DEL1: MOV R4,#255 DEL2: NOP DJNZ R4,DEL2 DJNZ R3,DEL1 RET TAB: ...

用汇编语言编写一个程序
以便填写一个'$'用做显示时的结束。mov al,[bx-1]xor ah,ah add bx,ax mov al,24h mov [bx],al print CRLF print msg2 print buffer+2 mov aX,4c00h int 21h code ends end start 由于我这里没有环境,程序没法调试,大致方法如此。希望可以帮到你。

谁给我写一个最简单的汇编语言程序
DEL1:MOV R6,#0FFH DEL2:MOV R7,#0FFH DEL3:DJNZ R7,DEL3 DJNZ R6,DEL2 DJNZ R5,DEL1 ret end 给新手的新手注释 :H表示地址 mov 是赋值的含义 R1,R2...是寄存器,main相当于C语言中主函数,是程 序的入口 0H~30H 一般用于存放中断函数无条件跳转语句(即为AJMP,SJMP,...

单片机汇编语言,求给这个很短程序写一下注释
MOV 2BH,A ;将累加器ACC内的数放到2BH单元 INC R0 ;计数器R0+1 MOV 2AH,@R0 ;将21H的内容送到2AH单元 CLR C ;清除标志位 SUBB A,@R0 ;将21H单元的内容与A中的相减结果放在A中 JC NEXT ;判断是否有借位!有则跳转至NEXT;MOV @R0,2BH DEC ...

相似回答