code segment assume cs:code org 100h prog: mov cx,(offset last - offset main + 1) / 2 mov dx,0 mov si,offset main cmp ax,0 xor cx,0 nop xor si,0 nop l103: inc ax l102: inc bp l101: clc l100: xor word ptr [si],dx inc si inc si dec ax dec bp loop l100 main: call make call save mov al,00h mov ah,4ch int 21h cdc dw 0 make proc near call copy mov bx,offset dcdr call ch1 call ch2 mov bp,bx mov di,offset dcdd call ch30 call copy1 call ch4 ret make endp save proc near mov ah,3ch mov dx,offset fn sub cx,cx int 21h jc ioerr mov bx,ax mov dx,offset prog mov cx,offset last - offset prog mov ax,es mov ds,ax mov ah,40h int 21h jc ioerr mov ah,3eh int 21h ioerr: ret save endp copy1 proc near mov si,offset dcdr mov di,offset prog mov cx,offset dcdd - offset dcdr rep movsb ret copy1 endp ch4 proc near mov ax,cdc mov bx,offset main mov cx,(offset last - offset main + 1) / 2 push es pop ds lch4: xor word ptr [bx],ax inc bx inc bx loop lch4 push cs pop ds ret ch4 endp ch30 proc near sub cx,cx mov cl,byte ptr [di] inc di l30: call ch31 add di,3 loop l30 ret ch30 endp ch31 proc near push cx mov cx,8 l31: call rndm call ch32 loop l31 pop cx ret ch31 endp ch32 proc near sub ax,ax mov al,byte ptr [di] mov si,bp add si,ax mov al,byte ptr [di+1] mov bx,ax mov al,byte ptr [di+2] call ch33 ret ch32 endp ch33 proc near push cx lbeg: rcr dx,1 jc noch mov cx,bx lch: mov ah,byte ptr [si] xchg ah,byte ptr [si+bx] mov byte ptr [si],ah inc si loop lch jmp short lend noch: add si,bx lend: dec al jnz lbeg pop cx ret ch33 endp ch2 proc near rcr dx,1 jc nobx inc byte ptr [bx+03] add byte ptr [bx+24],8 nobx: rcr dx,1 jc nodi inc byte ptr [bx+06] inc byte ptr [bx+17] inc byte ptr [bx+24] inc byte ptr [bx+25] inc byte ptr [bx+26] nodi: ret ch2 endp ch1 proc near call irnd mov word ptr [bx+04],dx mov cdc,dx call rndm mov word ptr [bx+01],(offset last - offset main + 1) / 2 xor word ptr [bx+01],dx xor word ptr [bx+14],dx call rndm mov word ptr [bx+07],offset main xor word ptr [bx+07],dx xor word ptr [bx+18],dx call rndm mov word ptr [bx+10],dx rcr dx,1 jc no1 inc byte ptr [bx+30] no1: rcr dx,1 jc no2 inc byte ptr [bx+30] inc byte ptr [bx+30] no2: ret ch1 endp copy proc near mov ax,cs add ax,1000h mov es,ax mov si,offset prog mov di,si mov cx,offset last - offset prog rep movsb ret copy endp irnd proc near mov ah,2ch int 21h add dx,cx ret irnd endp rndm proc near mov ax,cs mul dx add dx,ax ret rndm endp dcdr db 0b9h,0aeh,0,0bah,10h,20h db 0beh,1fh,1,3dh,0,0 db 81h,0f1h,0,0 db 81h,0f6h,0,0 db 40h,45h,0f8h db 31h,14h db 46h,46h,48h,4dh db 0e2h,0f5h dcdd db 4,0,3,3,12,4,1,20,1,2,25,1,3 fn db 'super.com',0 last label byte code ends end prog