write macro s lea dx,s mov ah,9 int 21h endm ;макрос для вывода строки sseg segment stack db 64 dup(?) sseg ends dseg segment mlen db 100 alen db ? key db 100 dup(?) ;для ввода ключа с клавиатуры fname db 255 dup(?) ;сюда копируется имя файла из командной строки buf db 100 dup(?) ;сюда читаются данные из файла s0 db 13,10,'Enter the crypt key: $' s1 db 'Error opening file',13,10,'$' s2 db 13,10,'Press any key...',13,10,'$' s3 db 'Crypting file $' s4 db 13,10,'File succesfully crypted$' dseg ends cseg segment assume cs:cseg,ss:sseg,ds:dseg main proc far ;командная строка хранится в PSP, по смещению 80h. 1й байт - длина командной строки, остальные байты - сама командная строка ;изначально, до инициализации, регистры es и ds указывают на начало PSP ;чем мы цинично и пользуемся =) push ds xor ax,ax push ax mov ax,dseg mov es,ax ;es указывает на сегмент данных, ds - на PSP ;------------- mov cl,ds:[80h] ;в cl записываем длину командной строки xor ch,ch ;обнуляем ch, чтоб сх был равен cl mov si,82h ;si указывает на начало командной строки lea di,fname ;di указывает на fname rep movsb ;копируем командную строку в fname mov ds,ax ;инициализируем регистр ds mov byte ptr[di-1],0 ;в fname в конец дописываем 0 (нужно, ибо функция открытия файла требует, чтоб в конце имени был 0) lea dx,fname mov ax,3d02h ;функция открытие файла в режиме чтения/записи int 21h ;вызываем прерыванеи ДОС mov byte ptr[di-1],'$' ;в fname в конец дописываем символ $ (ибо 9 функция вывода строки требует, чтоб строка заканчивалась $) jnc ok ;если открыли без ошибок, то переходим на ok write s1 ;иначе - матюкаемся write fname jmp readkey ;и валим ok: mov bx,ax ;запоминаем дескриптор файла, возвращённый ДОСом write s3 ;чего-то пишем write fname write s0 lea dx,mlen mov ah,10 int 21h ;и читаем ключ crypting: mov cl,alen xor ch,ch ;в СХ - длина ключа mov ah,3fh lea dx,buf int 21h ;читаем из файла в buf столько байт, сколько длина ключа mov bp,ax ;в АХ - количество реально прочитанных байт; копируем его в bp mov cx,ax ;и в СХ xor si,si ;а si - обнуляем crypt: mov al,buf[si] ;читаем очередной считанный байт xor al,key[si] ;ХОРим его с очередным байтом ключа mov buf[si],al ;и пишем обратно inc si ;переходим к следующему байту loop crypt ;да, переходим mov dx,bp ;в dx - количество считанных байт neg dx ;делаем его отрицательным mov cx,0ffffh ;и СХ делаем отрицательным mov ax,4201h ;функция перемещения указателя файла на ту позицию, с которой считали наш buf int 21h ;вызываем прерывание для выполнения функции lea dx,buf mov cx,bp mov ah,40h int 21h ;пишем буфер обратно (но уже зашифрованный) mov ax,bp cmp al,alen ;сравниваем количество обработанных (считанных, зашифрованных и записанных) байт с длиной ключа je crypting ;если равны - продолжаем обработку mov ah,3eh ;иначе - достигнут конец файла int 21h ;закрываем его write s4 ;------------- readkey: write s2 xor ah,ah int 16h ret main endp cseg ends end main |