wedl
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Доброго всем утра, делаю шифратор/дешифратор(методом перестановки байтов). Все скомпилировал. Но появилась проблема с чтением файла. .model small .stack 100h ;256 байт под стек .data ;-------------------------------------------------------------------------- ;Макрос: ввод строки в буффер entbuff macro string mov ah,0Ah lea dx,string int 21h endm ;-------------------------------------------------------------------------- ;Макрос: вывод строки на экран dispstr macro string mov ah,9h lea dx,string int 21h endm ;-------------------------------------------------------------------------- ; Сообщения выдаваемые на экран ;-------------------------------------------------------------------------- msg1 db 'Vvedite imia ishodnogo faila $' ; ввод имени исходного файла msg2 db 'Vvedite imia faila dlia sohranenia $' ; ввод имени нового файла msg3 db 'Vvedite posledovatelnost perestanovok ' num label byte db ' zifr (bez simvolov razdelitelei): $' ; Ввод ключа msg4 db 'Kodirovanie zaversheno$' ; кодирование завершено ;сообщения об ошибках OUTERR db 'Oshibka pri otkritii faila$' ; ошибка при открытии файла REAERR db 'Oshibka pri chtenii iz faila$' ; ошибка при чтении из файла CREAERR db 'Oshibka sozdania faila$' ; ошибка при создании файла CLOERR db 'Oshibka pri zakritii faila$' ; ошибка при закрытии файла WRERR DB 'Oshibka pri zapisi v vail$' ; ошибка при записи в файл NUERR db 'Oshibka pri vvode kluchevoi posledovatelnosti$' ; ошибка при вводе ключевой последовательности ;-------------------------------------------------------------------------- ; Список параметров для ввода имени входного файла ;-------------------------------------------------------------------------- inputfilepar label byte maxlenin db 100 ; максимальная длина actlenin db 100 ; фактическая длина inputf db 100 dup (0) ; область для хранения имени ;-------------------------------------------------------------------------- ; Список параметров для ввода имени выходного файла ;-------------------------------------------------------------------------- outputfilepar label byte maxlenout db 100 ; максимальная длина actlenout db 100 ; фактическая длина outputf db 100 dup (0) ; область для хранения имени ;-------------------------------------------------------------------------- ; Список параметров для ввода значения ключа ;-------------------------------------------------------------------------- bloc equ 8 ; константа размера блока кодирования key_choose label byte nkeylen db bloc +1 ; максимальная длина ankeylen db bloc +1 ; фактическая длина nkey db bloc +1 dup (0) ; область для хранения значения ;-------------------------------------------------------------------------- nbuf db bloc +1 dup (0) ; область для хранения значения ;-------------------------------------------------------------------------- ; Дескрипторы фаилов ;-------------------------------------------------------------------------- handle1 dw ? ; дескриптор исходного файла handle2 dw ? ; дескриптор нового файла ;-------------------------------------------------------------------------- ; Прочие данные ;-------------------------------------------------------------------------- ERRID db 0 ; флаг ошибки temp1 db bloc +1 dup ('0') ; для хранения блока данных ;-------------------------------------------------------------------------- ; Начало основного тела программы ;-------------------------------------------------------------------------- .code start: mov ax,@data ; инициализация mov ds,ax ; сегментных mov es,ax ; регистров call ENTERING ; вызов процедуры ввода с клавиатуры GO: call OPENF ; вызов процедуры открытия файла cmp ERRID,0 jnz ProgEX call KEY_NUMBER ; ввод ключа cmp ERRID,0 jnz ProgEX call CREATEF ; создание нового файла cmp ERRID,0 jnz ProgEX call KRYPT ; запись нового файла cmp ERRID,0 jnz ProgEX call CLOSEF ; закрытие файлов cmp ERRID,0 jnz ProgEX dispstr msg4 ; вывод конечного сообщения ProgEX: mov ah,8h ; ожидание нажатия клавиши int 21h mov ax,4C00h ; завершение программы int 21h ;-------------------------------------------------------------------------- ; процедура ввода параметров ;-------------------------------------------------------------------------- ENTERING proc dispstr msg1 ; вывод сообщения об имени исходного файла entbuff inputfilepar ; ввод имени call CH_STR mov bl,actlenin mov bh,00 mov inputf[bx],0 ; установка символа конца имени файла mov al,bloc add al,30h mov [num],al dispstr msg3 ; запрос на ввод числа изменения entbuff key_choose ; запоминаем ключ в символьном виде call CH_STR dispstr msg2 ; запрос на ввод имени выходного фаила entbuff outputfilepar ; ввод имени call CH_STR mov bl,actlenout mov bh,00 mov outputf[bx],0 ; установка символа конца имени файла ret ENTERING endp ;-------------------------------------------------------------------------- ; процедура открытия файла ;-------------------------------------------------------------------------- OPENF proc mov ah,3Dh mov al,00 lea dx,inputf int 21h ; открытие файла jc OPER ; переход в случае ошибки mov handle1,ax ; запоминание дескриптора файла jmp OPEN OPER: dispstr OUTERR ; вывод сообщения об ошибке mov ERRID,01 ; запись факта ошибки OPEN: ret OPENF endp ;-------------------------------------------------------------------------- ; процедура перехода на следующую строку ;-------------------------------------------------------------------------- CH_STR proc mov ah, 02h mov dl, 0Ah int 21h ; переход на следующую строку mov ah, 02h mov dl, 0Dh int 21h ; возврат каретки ret CH_STR endp ;-------------------------------------------------------------------------- ; процедура перевода сканкода ключа в числ0 ;-------------------------------------------------------------------------- KEY_NUMBER proc xor cx,cx ; зануление счетчика mov cl,ankeylen ; загружаем длину строки xor ax,ax ; обнуляем регистры ax и dx lea si,nkey ; загружаем адрес начала символов значения lea di,nkey Trans: lodsb ; загружаем символ в al sub al,49 ; перводим в число jc KEYERR cmp al,7 ; дальность пермещения не может быть больше чем (рзмер блока - 1) ja KEYERR stosb ; загружаем переведенные числа опять в ту же стороку loop Trans jmp KEYEX KEYERR: call CH_STR ; перевод строки dispstr NUERR ; сообщение об ошибке mov ERRID,01 ; запись факта ошибки jmp KEYEX KEYEX: ret KEY_NUMBER endp ;-------------------------------------------------------------------------- ; процедура создания файла ;-------------------------------------------------------------------------- CREATEF proc lea si,inputf ; сравниваем имена входного и выходного файлов lea di,outputf xor cx,cx mov cl,80 cld repe cmpsb ; посимвольная проверка имен фаилов jz CКER ; если одинаковые - ошибка CR: mov ah,5Bh mov cx,00 lea dx,outputf int 21h ; создаем новый файл jc CКER ; переход, если произошла ошибка создания или фаил с таким именем существует mov handle2,ax ; сохраняем дескриптор файла jmp CREATE CКER: dispstr CREAERR ; сообщение об ошибке mov ERRID,01 ; запись факта ошибки CREATE: ret CREATEF endp ;-------------------------------------------------------------------------- ; процедура закрытия файла ;-------------------------------------------------------------------------- CLOSEF proc mov ah,3Eh mov bx,handle1 ; загружаем дескриптор int 21h ; закрываем файл mov bx,handle2 ; загружаем дескриптор int 21h ; закрываем файл jc CLOUTERR jmp CLOSE1 CLOUTERR: dispstr CLOERR ; сообщение об ошибке mov ERRID,01 ; запись факта ошибки CLOSE1: ret CLOSEF endp ;-------------------------------------------------------------------------- ; процедура кодирования ;-------------------------------------------------------------------------- KRYPT proc begwrite: mov ah,3Fh mov bx,handle1 ; Файловый номер mov cx,bloc ; считываем bloc байт в память lea dx,temp1 int 21h ; считываем значения в память, начиная со смещения temp1 jc KRYPTERR cmp ax,0 ; проверяем сколько байт считано je endwr ; если 0, то файл закончился push ax cmp ax,bloc ; проверяем сколько байт считано jb ewr ; если <bloc, то не кодируем mov cx, bloc lea di,temp1 ; загружаем в di адрес начала блока данных lea si,nkey ; загружаем адрес начала ключа lea bx,nbuf changing: mov al,[di] ; заносим в al текущийц байт данных mov ah,[si] ; помещаем текущее значение ключа push bx push ax mov al,ah xor ah,ah add bx,ax pop ax mov [bx],al ;помещаем текучий байта в байт из буфера с номером взятым из ключа pop bx inc di inc si ;курсач гори в аду loop changing mov ah,40h mov bx,handle2 ; загружаем дескриптор нового файла pop cx ; записываем число обработанных байтов в счетчик lea dx,nbuf int 21h ; переписываем в новый файл jc WRIERR jmp begwrite ewr: mov ah,40h mov bx,handle2 ; загружаем дескриптор нового файла pop cx ; записываем число обработанных байтов в счетчик lea dx,temp1 int 21h ; переписываем в новый файл jc WRIERR jmp begwrite KRYPTERR: dispstr REAERR ; сообщение об ошибке mov ERRID,01 ; запись факта ошибки jmp endwr WRIERR: dispstr WRERR ; сообщение об ошибке mov ERRID,01 ; запись факта ошибки endwr: ret KRYPT endp end start С уважением Лев. |