Сортировка строк в текстовом файле
Ввод будет осуществляться прямо из программы. Для этого нам понадобятся функции 07h* и 02h* — ввод с клавиатуры без ЭХО и вывод символа на экран соответственно. Именно эти функции нам позволят обработать введенный символ, прежде чем он отобразится на экране. Это нам позволит корректно использовать клавишу BackSpace. Функцию 01h* (ввод символа с клавиатуры с ЭХО) использовать нежелательно, так как… Читать ещё >
Сортировка строк в текстовом файле (реферат, курсовая, диплом, контрольная)
Московский Энергетический Институт Институт автоматики и вычислительной техники Кафедра ВМСС Курсовая работа по дисциплине «Системное программное обеспечение»
Вариант 15
Сортировка строк в текстовом файле Студент: Филюк Андрей Группа: А-8−07
Проверил: Гольцов А.Г.
Москва 2010
Оглавление сортировка строка файл программа Введение
1. Анализ задания
2. Проектирование пользовательского интерфейса
3. Выбор формата представления данных
4. Список процедур и их назначение
5. Используемые в программе функции
6. Тестирование и отладка программы Заключение Список литературы Приложение. Листинг программы
Введение
Данная программа служит для сортировки строк в текстовом файле.
Текстовый файл представляет из себя последовательность символов (принадлежащих некому набору символов). Символы сгруппированы в строки. В современных системах строки разделяются разделителями строк, хотя в прошлом применялось хранение строк в виде записей постоянной или переменной длины.
Иногда конец текстового файла, особенно если в файловой системе не хранится информация о размере файла, также отмечается одним или более специальными знаками, известными как маркеры конца файла.
Различные операционные системы придерживаются своего представления перевода строки и конца файла. В UNIX перевод строки состоит из одного символа LF (0x0A), в Mac OS — из символа CR (0x0D), а в DOS и Microsoft Windows перевод строки кодируется последовательностью двух символов CR LF. В DOS и Microsoft Windows конец файла кодируется символом 0x1A, а в UNIX символ конца файла не употребляется.
Под сортировкой строк понимается посимвольное сравнение строк с помощью таблицы ASCII.
Программа может быть очень полезна, например когда необходимо отсортировать файлы с большим количеством строк, для быстрого наглядного поиска нужного элемента в файле. Легко найдет применение везде, где так или иначе нужна сортировка.
1. Анализ задания Разобьем нашу задачу на подзадачи:
Ввести пути к файлам, с которыми будем работать: путь к файлу, который необходимо отсортировать (в программе обозначен как Input file) и путь к файлу, в который сохраним результат (в программе — Output file).
Ввод будет осуществляться прямо из программы. Для этого нам понадобятся функции 07h* и 02h* - ввод с клавиатуры без ЭХО и вывод символа на экран соответственно. Именно эти функции нам позволят обработать введенный символ, прежде чем он отобразится на экране. Это нам позволит корректно использовать клавишу BackSpace. Функцию 01h* (ввод символа с клавиатуры с ЭХО) использовать нежелательно, так как некоторые символы нам ненужно отображать и тем более записывать в строку (например, Enter).
Ввести тип сортировки (в программе Input key [D/A]).
Для выбора типа сортировки: по возрастанию необходимо вести A, по убыванию — D. При воде необходимо учитывать верхний регистр вводимого символа. Дается две попытки на правильный ввод, потом программа осуществляет выход.
Подготовка файлов для работы.
Нам необходимо открыть один и создать второй файл, для этого мы будем использовать функции 3dh* и 3ch*, так как это единственные функции для работы с файлами, то выбор очевиден.
Сортировка.
Для этого необходимо, во-первых, считать блок данных из файла (с помощью функции 3fh*). Сортировать сами строки в памяти слишком нерационально, поэтому для сортировки нам понадобится массив с адресами начала строк. Потом необходимо отсортировать адреса строк соответствии с выбранным типом сортировки. Создать массив, в котором будут храниться данные о количество символов в уже отсортированных строках. Потом записать полученный результат в файл (с помощью функции 40h*).
*Функции относятся к прерыванию 21h.
2. Проектирование пользовательского интерфейса Интерфейс программы очень прост и удобен, пользователю достаточно запустить ЕХЕ файл и он увидит приглашение на ввод информации. Это будут последовательно 3 приглашения: на ввод пути к файлу, который надо закодировать (Input file), на ввод пути к файлу в который сохранится результат работы (Output file) и приглашение на ввод типа сортировки (Input key [D/A]).
После завершения на экране появится сообщение «Done», информирующее о том, что программа успешно завершила свою работу.
Если в процессе работы произошла какая либо ошибка, то тут же выведется соответствующее сообщение, и программа завершит свою работу.
3. Выбор формата представления данных Для определения переменных в программе используются метки db и dw (byte и word), а так же для некоторых переменных используется директива EQU для более гибкого написания кода.
В таблице 1 перечислены все переменные, использующиеся в программе.
Таблица 1
Список переменных
Имя | Метка | Примечание | |
msg0 | db | Сообщение. Информация о курсовом проекте. | |
msg1 | db | Сообщение. Приглашение на ввод файла (Input file). | |
msg2 | db | Сообщение. Приглашение на ввод файла (Output file). | |
msg3 | db | Сообщение. Сообщение. Информация о том, что надо ввести для сортировки по возрастанию или убыванию | |
msg4 | db | ||
msg5 | db | Сообщение. Появляется перед завершением работы программы, для того что бы сообщить пользователю, что необходимо нажать любую клавишу, что бы программ завершилась (Press any key) | |
msg6 | db | Сообщение. «Готово» сообщает о том, что процесс кодирования завершен (Done) | |
msg7 | db | Сообщение. Информация о неправильном вводе символа выбора типа сортировки. | |
msg8 | db | Сообщение. Количество попыток превышено, выход | |
err0 | db | Сообщение об ошибке. Открытие файла. | |
err1 | db | Сообщение об ошибке. Создание файла. | |
err2 | db | Сообщение об ошибке. Чтение из файла. | |
err3 | db | Сообщение об ошибке. Записи в файл. | |
err4 | db | Сообщение об ошибке. Закрытие файла. | |
err5 | db | Сообщение об ошибке. Файл имеет только нулевую строку. | |
num1 | EQU | Ограничение на длину, вводимой строки | |
file1 | db | Путь к файлу для сортировки | |
file2 | db | Куда сохранить отсортированный файл | |
flag | db | Флаг, отвечающий за тип сортировки. | |
num2 | EQU | Ограничение на длину данных | |
handle1 | dw | Заголовок файла, который надо отсортировать | |
handle2 | dw | Заголовок файла, в который записываем отсортированные строк | |
len_file | dw | Кол-во символов в файле | |
num_str | dw | Кол-во строк в файле | |
D | dw | Зарезервируем блок для хранения данных | |
mas | dw | Зарезервируем блок для массива адресов начала строк | |
mas_num | dw | Зарезервируем блок для массива кол-ва символов в строках | |
4. Список процедур, макросов и их назначение В таблице 2 указан список процедур, макросов и их назначение.
Таблица 2
Список процедур, макросов и их назначение
Имя | Назначение | |
Макрос вывода строки на экран. В качестве параметра — имя выводимой структуры, это должна быть строка, оканчивающаяся символом `$'. | ||
input_line | Процедура, осуществляющая ввод пути к файлу. Перед вызовом в регистре di, должен храниться адрес структуры, куда будет записан путь. | |
delete_char | Процедура, стирающая с экрана последний введенный символ, вызывается внутри процедуры INPUT_LINE при нажатии клавиши BackSpace. | |
reception_type | Процедура получения типа сортировки. | |
clear | Процедура очистки экрана. | |
open_file | Процедура открытия файла. Путь к файлу в file1, номер открытого файла сохранится в handle1. | |
read_file | Процедура чтения. Считывание происходит из файла file1, данные в структуру D. | |
make_mas | Процедура создания массива адресов строк. | |
sort | Процедура сортировки. | |
make_mas_num | Процедура создания массива длин отсортированных строк | |
create_file | Процедура создания файла. Путь к файлу в file2, номер созданного файла сохранится в handle2. | |
write_file | Процедура записи. Запись происходит в файл file2. На входе в регистре cx должно храниться количество байт для записи из структуры D. | |
close_file | Процедура закрытия файла. File1 закроется если он был открыт, а File2 закроется если он был создан. | |
exit | Завершение программы. Внутри вызывается процедура CLOSE_FILE, выводится сообщение «Press any key.» и ожидается ввод с клавиатуры символа, после этого программа завершает свою работу. | |
5. Используемы в программе функции Функция 02h прерывания 21h. Вывод символа на экран.
Вход: —;
Выход: DL = символ, который необходимо вывести.
(используется для отображения вводимой строки в процедуре input_line).
Функция 07h прерывания 21h. Ввод с клавиатуры без ЭХО.
Вход: —;
Выход: AL = считанный символ.
(используется для считывания кода символа в процедуре input_line).
Функция 0Ah прерывания 21h. Буферизованный ввод с клавиатуры.
Вход: адрес входного буфера (смотри ниже) Выход: —;
Первый байт буфера должен содержать максимальную длину на входе; второй байт содержит фактическую длину предыдущей линии, которая может будьте отозваны с командами редактирования линии DOC по возвращению второй байт содержит фактическую длину, третий и последующие байты содержат входную линию
(используется для считывания кода символа в процедуре reception_type).
Функция 0003h прерывания 10h. Установка видео режима.
Вход: AL =03h (Режим текст 80×25 формат 8×8 цвета 16)
Выход: —;
(используется для считывания кода символа в процедуре clear).
Функция 09h прерывания 21h. Вывод строки.
Вход: DS: DX = адрес строки, заканчивающейся `$'.
Выход: —;
(используется в программе для вывода информации о проекте, приглашения на ввод строки, а так же для вывода сообщений об ошибках).
Функция 3dh прерывания 21h. Открыть файл.
Вход:AL = код доступа (0 — чтение, 1 — запись, 2 — чтение запись).
DS:DX = адрес на строку в формате ASCIZ.
Выход:CF = 1 — есть ошибка, AX = код ошибки.
CF = 0 — нет ошибки, AX = номер файла.
Функция 3сh прерывания 21h. Создать файл.
Вход:СХ = атрибут.
DS:DX = адрес на строку в формате ASCIZ.
Выход:CF = 1 — есть ошибка, AX = код ошибки.
CF = 0 — нет ошибки, AX = номер файла.
Функция 3eh прерывания 21h. Закрыть файл.
Вход:BX = номер файла.
Выход:CF = 1 — есть ошибка, AX = код ошибки.
Функция 3fh прерывания 21h. Чтение из файла.
Вход:BX = номер файла.
CX = количество байт, которые необходимо считать.
DS:DX = адрес буфера.
Выход:CF = 1 — есть ошибка, AX = код ошибки.
CF = 0 — нет ошибки, AX = количество считанных байт.
Функция 40h прерывания 21h. Запись в файла.
Вход:BX = номер файла.
CX = количество байт, которые необходимо записать.
DS:DX = адрес буфера.
Выход:CF = 1 — есть ошибка, AX = код ошибки.
CF = 0 — нет ошибки, AX = количество записанных байт.
Функция 4ch прерывания 21h. Завершение программы.
Вход:AL = код завершения.
Выход: —;
6. Тестирование и отладка Тестирование на ошибочный ввод параметров.
Ввод несуществующего файла в качестве Input file.
Ввод некорректного пути к создаваемому фалу Output file.
Тестирование правильной работы.
Для тестирования правильной работы программы был выбран текстовый документ 1. txt с различными строками, сортировка была произведена в файл 2. txt сначала по возрастанию, потом по убыванию.
Результат тестирования на ошибочный ввод параметров.
Программы выполнила все тесты, выводя соответствующие сообщения об ошибках, тесты не привели к критическому завершению программы.
Результат тестирования правильной работы.
После сортировки файла 1. txt в 2. txt строки были отсортированы в зависимости от выбранного типа сортировки.
Заключение
Программа работоспособна и соответствует предъявленным требованиям. Проделано тестирование программы и соответствующая отладка по устранению ошибок.
1. П. Абель Язык ассемблера для IBM PC и программирования — М.: ЭНТРОП, 2007. -447с.
2. Файл руководства по системным функциям — interrup. lst
Приложение А
«Листинг программы»
;Курсовой проект
;Выполнил:Филюк Андрей
;Группа:А-8−07
;Тема:Сортировка строк в текстовом файле
;макрос вывода строки, заканчивающейся $
printmacro str;в str — адрес выводимой структуры
mov ah, 09h;выбор функции вывода строки, заканчивающейся $
lea dx, str;сохраняем адрес в dx
int 21h;выводим строку
endm
.model small
.stack 100h
.data
msg0 db 13,10,'Filuk Andrew A-8−07 ',' File sorting ', 13,10,'$'
msg1db13,10,'Input file: $'
msg2db13,10,'Output file: $'
msg3 db 13,10,'For descending sort need enter key D', 13,10,'For ascending sort need enter key A', 13,10,'$'
msg4 db 13,10,'Input key [D/A]:? $'
msg5db13,10, 'Press any key. $'
msg6db13,10, 'Done$'
msg7db13,10, 'Incorrect input, please try again $'
msg8db13,10, 'Sorry, try next time $'
;сообщения об ошибках
err_0db13,10, ' Error 0: Can not open file $'
err_1db13,10, ' Error 1: Can not create file $'
err_2db13,10, ' Error 2: Can not read file $'
err_3db13,10, ' Error 3: Can not write file $'
err_4db13,10, ' Error 4: Can not close file $'
err_5db13,10, ' Error 5: File have only null string $'
num1 EQU 80h
file1dbnum1 DUP (0);путь к файлу, который надо отсортировать
file2dbnum1 DUP (0);куда сохранить отсортированный файл
flag db 2;флаг
num2 EQU 1000h
handle1 dw 0;заголовок файла, который надо отсортировать
handle2 dw 0;заголовок файла, в который записываем отсортированные строки
len_file dw 0;кол-во символов в файле
num_str dw 0;кол-во строк в файле
D db num2 DUP ('D') ;данные
mas dw 100h DUP ('#');массив адресов начала строк
mas_num dw 100h DUP ('*');массив кол-ва символов в строках
.code
Start:
mov ax, @data;сохраним адрес на сегмент данных в AX
mov ds, ax;инициализация сегмента данных
mov es, ax;инициализация сегмента дополнительных данных
call clear;процедура очистки экрана
print msg0;вывод сообщенияо о проекте
print msg1 ;вывод сообщения на ввод пути вх. файла
lea di, file1;сохраним адрес на структуру file1 в di
call input_line;вызываем процедуру ввода строки
print msg2;вывод сообщения на вывод пути вых. файла
lea di, file2;сохраним адрес на структуру file2 в di
call input_line;вызываем процедуру ввода строки
call reception_type;процедура определения типа сортировки (по озрастанию или убыванию)
call open_file;открытие файла, который надо отсортировать
call read_file;чтение файла
call make_mas;создание массива начала адресов строк
call sort;сортировка
call make_mas_num;создание массива кол-ва символов в уже отсортированном массиве адресов строк
call create_file;создание файла для вывода
call write_file;запись в файл
print msg6;вывод сообщения
call exit;выход с закрытием файлов
;—————————Получение типа сортировки———————————-;
reception_type proc
push ax;ах в стек
print msg3;вывод сообщения
mov cx, 2;кол-во попыток неправильного ввода
k0:
print msg4;вывод сообщения
lea dx, flag ;dx указывает на первый байт буфера
mov ah, 0ah;буферизованный ввод с клавиатуры
int 21h
mov ah, 02h ;ывод символа на экран
mov dl, 0dh;символ возврата коретки (для буфера)
int 21h
cmp flag+2, 65;введена клавиша A?
jne k1;нет, переход по метке сравнения с клавишей D
mov flag, 0 ;иначе устанавливаем флаг в 0
jmp k3 ;на выход
k1: cmp flag+2, 68 ;введена ли клавиша D?
jne k2;нет, переход по метке k2
mov flag, 1;иначе устанавливаем флаг в 1
jmp k3 ;переход по метке
k2:
print msg7;вывод сообщения
loop k0
print msg8;вывод сообщения
call exit2 ;Не введено ни A, ни D, — выход
k3:
pop ax;возврат значения из стека
ret
endp
;——————————————— Очистка экрана ——————————————-;
clear proc
mov ah, 00h; Установка видеорежима дисплея
mov al, 03h; Номер видеорежима
int 10h
ret
clear endp
;————————————————Ввод строки————————————————-;
input_line proc
mov cx, 0;в CX будет храниться количество введенных символов
m0:
mov ah, 07h;выбор функции ввод с клавиатуры без ЭХО
int 21h;ждем
cmp al, 08h;проверяем на BackSpace
jne m2;если да — переходим на m2
cmp cx, 0;если нет — проверяем есть ли что удалять
je m0;если строка пуста — возвращаемся на начало и ждем ввода
call delete_char;если строка не пуста — стираем с экрана последний введенный символ
dec di;уменьшаем адрес, где сохранен путь на 1
dec cx;уменьшаем количество введенных символов на 1
jmp m0;возвращаемся на начало и ждем ввода
m2:
mov ah, 02h;выбор функции вывода символа на экран
mov dl, al;считанный ранее символ хранится в al — записываем его в dl
int 21h;выводим его
mov [di], al;сохраняем по адресу di
inc di;переходим на следующую ячейку
inc cx;увеличиваем количество введенных символов на 1
cmp cl, num1;огранисчение на 80 символов
je m1;если ввели 80 символом, то считаем что строка введена
cmp al, 0dh;проверяем не нажат ли Enter
jne m0
dec di;возвращаемся в предыдущую ячейку
m1:
mov al, 00h;что бы записать символ конца строки — 0
mov [di], al;записываем
ret
endp
;————-Стереть символ с экрана———————;
delete_charproc
;при работе испортится регистр ax
push ax;сохраним его в стек
mov ah, 02h;функция вывода символа на экран
mov dl, 08h;символ — Backspace
int 21h;выводим, тем самым переместим курсор влево на 1
mov dl, 20h;символ — space
int 21h;выводим, тем самым сотрем с экрана символ на котором находится курсор
;и сместим курсор вправо на 1
mov dl, 08h;символ — Backspace
int 21h;выводим, тем самым вернем курсор обратно влево
pop ax;восстановим регистр ax
ret
endp
;————————-Открытие файла———————————;
open_fileprocnear
mov ah, 3dh;функция открытия файла
mov al, 00; 00 — для чтения
lea dx, file1;путь к файлу в file1
int 21h ;открываем
jnc m3;если не было ошибки — то на метку m3
print err0;если была ошибка — выводим соотв. сообщение
call exit2;завершаем работу
m3:
mov handle1, ax;сохраняем номер файла в handle1
ret
endp
;————————-Чтение из файла——————————-;
read_fileproc
mov ah, 3fh;функция чтения из файла
mov bx, handle1;номер файла — откуда считать
mov cx, num2;количество байт, которые надо считать
lea dx, D;буфер для данных
int 21h;считываем
mov len_file, ax
jnc m4;если не было ошибки — то на метку m4
print err2;если была ошибка — выводим соотв. сообщение
call exit;завершаем работу
m4:
ret
endp
;————————-Создание массива адресов строк———;
make_mas proc
push ax;сохраним его в стек
mov ax, len_file;в ах кол-о символов в файле
or ax, ax;сравнение на нулевой файл
jnz m51;нет -> идем по метке создания массива
print err5;если была ошибка — выводим соотв. сообщение
call exit;на выход
m51:
xor bx, bx;обнуляем bx
xor dx, dx;обнуляем dx
lea di, D;в di адрес начала первой строки
mov mas[bx], di;заносим её адрес в массив
mov al, 0Ah ;поиск ведем по символу конца строки
mov cx, len_file;загрузим кол-во символов в файле
cld;сканирование осуществляем вперед
m5:repne scasb;сканирование в поиcке заданного символа, пока счетчик не обнулиться, остановиться когда найдет символ 0, записанный в al
add bx, 2;организация перехода на след. элемент массива
mov mas[bx], di;заносим адрес начала след. строки в массива
inc dx;+1
inc cx;+1
loop m5
mov num_str, dx;в переменную num_str сохраняем кол-во строк
mov byte ptr [di], 0Dh;добавляем концевой символ
mov byte ptr [di+1], 0Ah;добавляем концевой символ
pop ax;восстановим регистр ax
ret
endp
;————————-Сортировка строк—————————-;
sort proc
push ax;заносим ах стек
sort1:
xor si, si;обнуляем si
mov bh, 0;используем bh как флаг, если строки перемещались, то флаг установился в 1
mov cx, num_str;в сх кол-во строк для организации цикла
dec cx;-1
cmp cx, 0;если в файле одна строка, то сортировка не нужна
jnz sort2;если нет -> сортируем
jmp end_sort;иначе выход
sort2:
xor ax, ax;обнуляем ах
push cx;сх стек
mov ax, mas[si]; адрес начала строки в ax
mov dx, mas[si+2]; адрес начала след. строки в dx
push si;si в стек
mov si, ax;в si адрес начала строки
mov di, dx;в di адрес начала след. строки
dec si;-1
dec di;-1
compare_string:
mov cl, byte[si]; в cl заносим символ строки
mov ch, byte[di]; в ch заносим символ след. строки
cmp flag, 0;определяем тип сравнения. по возрастанию?
jz increase;да -> переход на алгоритм сортировки по возрастанию, иначе по убыванию
cmp ch, 0Dh;сравниваем символ строки с адресом конца строки
jz next_string;если равен -> перех к сравнению след. строк
cmp cl, 0Dh;сравниваем символ след строки с адресом конца строки
jz change;если да -> меняем
cmp cl, ch;производим сравнение символов находящихся не в концах строк
je next_simbol;равны следовательно переход по метке к сравнению след символа в строках
cmp cl, ch;сравниваем какой из них «больше»
ja next_string;переход если сl > сh
jmp change;иначе меняем строки
increase:
cmp cl, 0Dh;сравниваем символ след строки с адресом конца строки
jz next_string;если равен -> перех к сравнению след. строк
cmp ch, 0Dh;сравниваем символ строки с адресом конца строки
jz change;если да -> меняем
cmp cl, ch;производим сравнение символов находящихся не в концах строк
je next_simbol;равны следовательно переход по метке к сравнению след символа в строках
cmp cl, ch;сравниваем какой из них «больше»
jb next_string;переход если сl < сh
jmp change;иначе меняем строки
change:
xchg ax, dx;меняем адреса строк
mov bh, 1;устанавливаем флаг
jmp next_string;переход к след. строке
next_simbol:
inc si;переход к след символу строки
inc di;переход к след символу строки
jmp compare_string;на метку сравнения строк
next_string:
pop si;возращаем из стека si
mov mas[si], ax;заносим адреса отсортированных строк в массив
mov mas[si+2], dx;заносим адреса отсортированных строк в массив
pop cx;возращаем из стека сх
add si, 2;организация перехода к след. строке
loop sort2
cmp bh, 0;сравниваем флаг на перемещение строк.
jz end_sort;если не было перемещений -> выход
jmp sort1;иначе продолжаем сравнивать
end_sort:
pop ax;возращаем из стека ах
ret
endp
;——-Создание массива длин отсортированных строк———;
make_mas_num proc
push ax;заносим ах в стек
xor si, si;обнуляем si
mov cx, num_str;в сх заносим кол-во строк для организации цикла
m6:
push cx;заносим сх в стек
mov di, mas[si]; адрес начала строки в ax
push di;заносим адрес начала в стек
mov al, 0Ah ;в al заносим символ который ищем
mov cx, len_file;загрузим максимальный объем
cld;сканирование осуществляем вперед
repne scasb;сканирование в поиcке заданного символа, пока счетчик не обнулиться, останоиться когда найдет символ 0, записанный в al
pop ax;возвращаем из стека
sub di, ax ;вычитаем из di адрес начала строки для получения длины строки
mov mas_num[si], di;заносим длину строки в массив
add si, 2;организация перехода к след элементу
pop cx;возращаем изз стека сх
loop m6
pop ax;возвращаем из стека ах
ret
endp
;—————————Cоздание файла——————————-;
create_file proc
mov ah, 3ch;функция создания файла
mov cx, 00h;файл — обычный
lea dx, file2;file2 — путь к файлу
int 21h;создаем
jnc m7;если не было ошибки — то на метку m7
print err1;если была ошибка — выводим соотв. сообщение
call exit;завершаем работу
m7:
mov handle2, ax;сохраняем номер файла в handle2
ret
endp
;—————————Запись в файл———————————;
;при входе в процедуру в cx — количество байт для записи
write_file proc
xor si, si;обнуляем si
mov cx, num_str;в сх заносим кол-во строк для организации цикла
m8:
push cx;заносим сх в стек
mov ah, 40h;функция записи в файл
mov bx, handle2 ;номер открытого файла
mov cx, mas_num[si] ;количество символов которые надо
mov dx, mas[si]
int 21h ;записываем
jnc m9;если не было ошибки — то на метку m9
print err3;если была ошибка — выводим соотв. сообщение
call exit;завершаем работу
m9:
add si, 2;переход к след. элементу
pop cx;возвращаем из стека сх
loop m8;пока сх не равен нулю возврат по метке m8
ret
endp
;—————————Закрытие файлов———————————;
close_file proc
cmp handle1, 0;проверяем был ли открыт файл
je m10;если нет — закрывать нечего, переходим на m10
mov ah, 3eh;функция закрытия файла
mov bx, handle1;номер файла
int 21h;закрываем
jnc m10;если не было ошибки — то на метку m10
print err4;если была ошика — выводим соотв. сообщение
call exit;завершаем работу
m10:
cmp handle2, 0;проверяем был ли создан файл
je m11;если нет — закрывать нечего, переходим на m11
mov ah, 3eh;функция закрытия файла
mov bx, handle2;номер файла
int 21h;закрываем
jnc m11;если не было ошибки — то на метку m11
print err4;если была ошибка — выводим соотв. сообщение
call exit;завершаем работу
m11:
ret
endp
;—————————Выход——————————————-;
exit proc
call close_file;вызров процедуры закрытия файлов
exit2:
print msg5;вывод сообщения «Press any key.»
mov ah, 07h;функция ввода с клавиатуры бех ЭХО
int 21h;ждем нажатия клавиши
mov ax, 4c00h;выход из программы с кодом возврата 0
int 21h;выходим
ret
endp
End Start