Не вводить ключ.
Тестирование правильной работы программы.
Для тестирования правильной работы программы были использованы файлы с различными параметрами, соответственно с разными размерами расширениями.
Результат:
Программа выполнила все тесты, правильно отреагировав на все возможные ошибки.
Заключение
Программа работоспособна и соответствует предъявленным требованием.
Так как в программе использованы стандартные устройства ввода-вывода, впервые введенные в MS-DOS 2.0, то для работоспособности программы необходимо наличие на машине операционной системы не ниже чем MS-DOS 2.0.
Возможно дальнейшее усовершенствование данной программы в сторону быстродействия.
Список литературы
1. П. Абель Язык ассемблера для IBM PC и программирования - М.: ЭНТРОП, 2007. -447с.
. Файл руководства по системным функциям - interrup.lst
. Сведения о функциях работающих по прерыванию INT 21: #"justify">Приложение
Листинг программы
.model small
.data_in_file LABEL BYTE ;Список параметров:
maxlen_in DB 20 ; Максимальная длина_in DB ? ; Реальная длина_in DB 20 DUP (' ') ; Введенные символы
Input_out_file LABEL BYTE ;Список параметров:
maxlen_out DB 20 ; Максимальная длина_out DB ? ; Реальная длина_out DB 20 DUP (' ') ; Введенные символы_key LABEL BYTE ;Список параметров:_key DB 20 ; Максимальная длина_key DB ? ; Реальная длина_key DB 20 DUP (' ') ; Введенные символы
;----------------------------------------------------------------------------_str db 10,13,'$'_in_file db 'sourse file is :','$'_out_file db 'out file is :','$'_key db 'key is :','$'_in_file_m db 'error: cannot open sourse file','$'_out_file_m db 'error: cannot open out file','$'_key_m db 'error: key was not entered','$'_done db 'done.','$'db 256 DUP (0)_in dw ?_out dw ?_len dw ?
count dw ?
;----------------------------------------------------------------------------
.code
;Макрос ввода с клавиатуры
input_kbd macro request, label_kbd, namefldah,09hdx,request ;запрос на ввод21h
mov ah,09hdx,new_str ;переход на новую строку21hah,0ahdx,label_kbd ;ввод данных с клавиатуры
int 21h
mov ah,09hdx,new_str ;переход на новую строку21hbx,bx ;делаем введенную строку ASCIZ-строкой
mov bl,[label_kbd+1][namefld+bx],0
;----------------------------------------------------------------------------
;макрос чтения из файлаmacro file_handle,byte_readah,3Fhbx,file_handle ;файловый индекс
mov cx,byte_read ;число считываемых байтdx,buff ;адрес буфера для чтения данных21h
;макрос записи в файл
write macro file_handle,byte_writeah,40hbx,file_handle ;файловый индекс
mov cx,byte_write ;число записываемых байтdx,buff ;адрес буфера, содержащего записываемые данные21h
;макрос инициализацииmacroax,@data ;установка регистра ds на началоds,ax ;сегмента данных
;----------------------------------------------------------------------------
;код;макрос инициализации
;----------------------------------------------------------------------------
input_kbd requst_in_file, Input_in_file, namefld_in ;макрос ввода входного файла_kbd requst_out_file, Input_out_file, namefld_out ;макрос ввода выходного файла_kbd requst_key, Input_key, namefld_key ;макрос ввода ключа
;----------------------------------------------------------------------------actlen_key,0err_noerr_key
;----------------------------------------------------------------------------_no:
mov ah,3dh ;открытие исходного файлаal,02h ;режим чтения-записи
lea dx,namefld_in21hin_file_rdyerr_in_file
;----------------------------------------------------------------------------_file_rdy:handle_in,ax ;запоминаем файловый индекс
mov ah,3ch ;создание выходного файла
mov cx,0 ;обычный файлdx,namefld_out21hout_file_rdyerr_out_file
;----------------------------------------------------------------------------_file_rdy:
mov handle_out,ax ;запоминаем файловый индекс
xor bx,bxbl,actlen_key
mov key_len,bx ;запоминаем длину ключа в key_len
;----------------------------------------------------------------------------coding
;----------------------------------------------------------------------------exit
;----------------------------------------------------------------------------proc near:handle_in,key_len ;читаем из входного файлаcount,axax, 0copy_retsi,buffdi,namefld_keycx,count_key:al,[di]
add [si],al ;cумируем данные с ключем
inc sidiadd_key
write handle_out,count ;записываем просуммированное в выходной файл
cmp ax,key_lencopy_ret:endp
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;в программе декодирующей закодированный файл, необходимо заменить
;процедуру coding на decoding. Описание процедуры decoding приведено ниже
decoding proc near:handle_in,key_len ;читаем из входного файлаcount,axax, 0copy_retsi,buffdi,namefld_keycx,count_key:al,[di][si],al ;вычитаем ключsidiadd_keyhandle_out,count ;записываем просуммированное в выходной файлax,key_lencopy_ret:endp
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------_key proc nearah,09hdx,err_key_m ;error: key was not entered21hexit_key endp
;----------------------------------------------------------------------------_in_file proc nearah,09hdx,err_in_file_m ;error: cannot open sourse file21hexit_in_file endp
;----------------------------------------------------------------------------_out_file proc nearah,09hdx,err_out_file_m ;error: cannot open out file21hexit_out_file endp
;----------------------------------------------------------------------------proc nearah,3eh ;закрываем входной файл
mov bx,handle_in21h
mov ah,3eh ;закрываем выходной файл
mov bx,handle_out21hah,09hdx,new_str ;пропускаем строку21hah,09hdx,mess_done ;done.
int 21hax,4c00h ;завершение программы21hendp