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