中山大學 West BBS-西子灣站

『主選單』
分類佈告
分類精華
休閒聊天
個人郵件
個人設定
重新登入
『應數系組合語言(楊昌彪老師)』一般區佈告
←回列表  ↑上一篇  ↓下一篇        張貼  回應       
發信人: HSBoy (偷偷親妳一下)    看板:math-asm
日期: Fri Jul  4 02:57:19 1997
標題: 給大家參考一下
來源: 中山大學 Formosa BBS Client


PRINT macro string
      mov dx,offset string
      mov ah,09h
      int 21h
      endm

INPUT macro string
      mov dx,offset string
      mov ah,0ah
      int 21h
      endm

cod   segment
      assume cs:cod,ds:cod

begin:
      push cs
      pop  ds

      mov ax,offset warning
      mov ax,offset scanbuffer
      mov ax,offset scancode
      mov ax,offset file_read_pointer_dx
      mov ax,offset file_read_pointer_cx

      mov ah,1ah          ; 1AH 呼叫
      mov dx,offset dta   ; 設定 DTA(用來存放搜尋到的檔名)
      int 21h

      PRINT msg_input
      INPUT path          ; 輸入檔名
      mov bl,path[1]      ; 取檔名長度
      xor bh,bh
      mov path[bx+2],00h  ; 補上 00h, 變成 ASCIZ 字串
      PRINT crlf
      PRINT crlf

      mov ah,4eh               ; 4EH 呼叫
      mov dx,offset path[2]    ; 指向徑名
      mov cx,07h               ; 屬性 隱藏檔(02H)+系統檔(04H)+Volumn(01H)
      int 21h
      jc nofile                ; 利用 C 旗標; 若 C=0, 成功
                                 ; 若 C=1, 失敗

nxt:  ; 下一個檔案
      nop
      mov bx,offset dta+1eh    ; BX 指向 DTA 的檔名
      PRINT msg_scaning
putfn:                         ; output file name
      nop
      mov dl,[bx]
      test dl,dl
      je scan
      mov ah,02h
      int 21h
      inc bx
      jmp putfn

scan:
      ; 開啟第一個檔
      nop
      mov ax,3d02h             ; 3DH 呼叫, mode: read only
      mov dx,offset dta+1eh    ; DX 指向 DTA 的檔名
      int 21h                  ; 開檔完成
      jc  error1               ;...........................................
      mov file_handle,ax       ; transfer file-handle

      ; 移動讀寫頭至檔案起始處(似乎可省略)
      mov file_read_pointer_dx,0h
      mov file_read_pointer_cx,0h
     ; mov warning,01h                 ; set dangerous
readfile:
      nop
      mov warning,01h                 ; set dangerous
      mov bx,file_handle              ; 指定 file handle
      mov dx,file_read_pointer_dx
      mov cx,file_read_pointer_cx
      mov ax,4200h                    ; 42H 呼叫, 模式: 相對檔頭開始位置
      int 21h

      ; file_read_pointer 加 1
      cmp file_read_pointer_dx,0ffffh
      je @1
      jmp @2
   @1:
      inc file_read_pointer_cx
      mov file_read_pointer_dx,0h
      jmp @3
   @2:
      inc file_read_pointer_dx
   @3:

      ; 將開啟的檔案  讀10h個bytes到buffer
      mov ah,3fh                ; 3FH 呼叫
      mov dx,offset scanbuffer  ; 指定 buffer
      mov cx,010h               ; 指定長度
      mov bx,file_handle        ; 指定 file handle
      int 21h
      jc  error2;........................................................
      cmp ax,010h      ; 當無法讀到 10h bytes 時  即為讀畢
      jb  readcomplete;..................................................

      xor cx,cx
      mov bx,offset scancode
      mov si,offset scanbuffer
  scanfile:
      nop
      mov al,[bx]      ; mov al,ds:[bx]
      cmp al,[si]      ; cmp al,ds:[si]
      jne readfile

      ;jne setnowarning
      ;  @returnsetnowarning:
      inc bx
      inc si
      inc cx
      cmp cx,10h
      je file_virused
      jmp scanfile
      ;jmp scanfile

next:
      ; 3EH 呼叫(關閉檔案, 解決 file handle 不足)
      nop
      mov bx,file_handle
      mov ah,3eh
      int 21h

      ; 4FH 呼叫(取下一個符合的檔名)
      PRINT crlf
      mov ah,4fh        ; 4FH 呼叫(取下一個符合的檔名)
      int 21h
      jnc nxt           ; C=0 表示非最後一個檔
      PRINT msgeof
      jmp exit

setnowarning:
     ; mov warning,0h
     ; jmp @returnsetnowarning

nofile:
      PRINT msgnof

exit:
      mov ah,4ch        ; 4CH 呼叫, return to DOS
      int 21h

error1:;...................................................................
      nop
      PRINT error_1
      jmp exit
error2:;................................................................
      PRINT error_2
      jmp exit

readcomplete:;.............................................................
      ;cmp warning,01h  ; dangerous
      ;je file_virused
      PRINT msg_ok
      jmp next

file_virused:
      PRINT file_virus
      jmp exit


msgnof    db    0ah,0dh,'File not found!',0ah,0dh,'$'
msgeof    db    0ah,0dh,'End of file.',0ah,0dh,'$'
crlf      db    0ah,0dh,'$'
dta       db    128 dup(?)
path      db    64,65 dup(?)
warning   db    ?
error_1   db   'error1 in scan$'
error_2   db   'error2 in readfile$'
msg_ok    db   ' No virus found!$'
msg_input      db    0ah,0dh,'INPUT SCAN-VIRUS PATH:$'
msg_scaning    db    'Scaning $'
scanbuffer     db    10h dup (?)
file_virus     db    '  The file is infected!!$'
scancode       db    'B4FF5980FC0C0600'
file_read_pointer_dx dw ?
file_read_pointer_cx dw ?
file_handle    dw    ?

cod ends
    end begin


------------------------------------------------------------

        貼上來, 上篇布告有說不清楚的地方, 在這應該找得到答案!!

        希望這篇布告, 對某些熱愛程式的人,  會有些許的幫助!!




--

         我最喜歡白雪公主小美人魚了
              真的好喜歡唷~~~~ *^_^*




←回列表  ↑上一篇  ↓下一篇        張貼  回應