Работа с файлами (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 выполняет следующие действия:
- Запрос на ввод имени файла.
- Поиск указанного файла в текущей директории.
- Файловые операции: открытие, чтение, запись и закрытие указанного файла.
- Создание нового файла.
- Вывод сообщения об ошибке или об успешном выполнении операций.
- Закрытие файла.
- Вывод сообщения
ОК!
. - Выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д