Работа с файлами (tasm) - Assembler
Формулировка задачи:
Помогите пожалуйста, проепод по ассемблеру в начале семестра заболел на 5 недель, и в итоге все проги не успеваю написать в срок. Задание прикреплено, по возможности сделайте комментарии, хотя бы к ключевым поворотам в программе, пишем проги в TASMе. Всем заранее спасибо и +9999 к карме
Решение задачи: «Работа с файлами (tasm)»
textual
Листинг программы
- ;== FASM code =======================
- org 100h
- jmp start
- mes0 db 13,10,' File name..: $'
- mes1 db 13,10,' Find file..: $'
- mes2 db 13,10,' Create file: OK!'
- db 13,10,' --------------------------'
- db 13,10,' Press any key... $'
- okey db 'OK! $'
- err db 'ERROR! $'
- newFn db 'result.txt',0 ; новый файл
- fName db 13 dup(0) ; сюда будем читать имя файла с данными
- buff db 1024 dup(0) ; буфер под файл
- wrStr db 80 dup('*'),13,10 ; строка для записи забитая звёздами
- fSize dw 0 ; размер файла с данными
- handl dw 0 ; дескриптор файла
- start:
- ;----- Запрос на ввод имени файла --------------------------------------
- mov dx,mes0 ;
- call message ;
- call input ; вводим имя
- ;----- Поиск указанного файла в текущей директории ---------------------
- mov dx,mes1 ;
- call message ;
- call find ; ищем файл..
- jnc begin ; продолжить, если есть такой файл
- mov dx,err ;
- call message ; иначе: мессага с ошибкой
- jmp exit ; ..и на выход!
- begin: mov dx,okey ; ОК!
- call message ;
- ;----- Файловые операции -----------------------------------------------
- call open ; открыть/читать/закрыть указанный файл
- call create ; создаём новый
- mov cx,[fSize] ; размер файла с данными (длина цикла)
- mov di,buff ; его адрес для SCASB
- next: call cutStr ; вырезаем по-строке из буфера
- call write ; записываем её в созданный файл
- call clear ; очищаем буфер записи для сл.строки
- or cx,cx ; все данные проверили?
- jnz next ; нет - мотаем цикл..
- ;----- Закрываем файл. Мессага ОК! -------------------------------------
- mov ah,3Eh ;
- int 21h ;
- mov dx,mes2 ;
- call message ;
- exit: xor ax,ax ; выход..
- int 16h ;
- int 20h ;
- ;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
- ;------------------------------------------------------------------------
- message: mov ah,9 ; вывод строки на экран
- int 21h ;
- ret ;
- ;------------------------------------------------------------------------
- input: pusha ; Ввод имени файла -------------------------
- mov cx,12 ; всего символов (8.3)
- mov di,fName ; куда сохранять
- mov ah,1 ;
- @@1: int 21h ;
- cmp al,13 ; Enter - закончить ввод
- je @@2 ;
- stosb ; сохраняем ввод
- loop @@1 ;
- @@2: popa ;
- ret ;
- ;------------------------------------------------------------------------
- find: pusha ; Искать файл ------------------------------
- mov ah,4Eh ;
- mov dx,fName ;
- mov cx,20h ;
- int 21h ;
- popa ;
- ret ;
- ;------------------------------------------------------------------------
- open: pusha ; Открыть файл -----------------------------
- mov ax,3D00h ;
- mov dx,fName ;
- int 21h ;
- xchg bx,ax ; дескриптор
- mov ah,3Fh ; Читать файл ------------------------------
- mov cx,0FFFFh ; максимум байт
- mov dx,buff ; куда сохранять
- int 21h ;
- mov [fSize],ax ; сохраняем размер файла
- mov ah,3Eh ; Закрыть файл с данными -------------------
- int 21h ;
- popa ;
- ret ;
- ;------------------------------------------------------------------------
- create: pusha ; Создать файл -----------------------------
- mov ah,3Ch ;
- mov dx,newFn ; имя нового файла
- mov cx,20h ; атрибут архивный
- int 21h ;
- mov [handl],ax ; сохраняем дескриптор
- popa ;
- ret ;
- ;------------------------------------------------------------------------
- cutStr: mov bx,cx ; Поиск и копирование строки
- mov al,0Ah ; символ для поиска
- repne scasb ;
- push cx di ;
- sub bx,cx ;
- xchg bx,cx ; СХ - длина слова
- mov si,di ;
- sub si,cx ; SI - источник
- mov di,wrStr ; DI - приёмник
- sub cx,2 ;
- rep movsb ; копируем СХ-байт
- pop di cx ;
- ret ;
- ;------------------------------------------------------------------------
- write: pusha ; Запись в файл ----------------------------
- mov ah,40h ;
- mov bx,[handl] ;
- mov dx,wrStr ; от куда брать данные для записи
- mov cx,82 ; сколько байт записать
- int 21h ;
- popa ;
- ret ;
- ;------------------------------------------------------------------------
- clear: pusha ; Очистка буфера данных
- mov di,wrStr ; ..для сл.строки
- mov cx,80 ; сколько повторов
- mov al,'*' ; чем заполнить
- rep stosb ; запись
- popa ;
- ret ;
Объяснение кода листинга программы
Этот код на языке Assembler выполняет следующие действия:
- Запрос на ввод имени файла.
- Поиск указанного файла в текущей директории.
- Файловые операции: открытие, чтение, запись и закрытие указанного файла.
- Создание нового файла.
- Вывод сообщения об ошибке или об успешном выполнении операций.
- Закрытие файла.
- Вывод сообщения
ОК!
. - Выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д