Работа с файлами (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 выполняет следующие действия:

  1. Запрос на ввод имени файла.
  2. Поиск указанного файла в текущей директории.
  3. Файловые операции: открытие, чтение, запись и закрытие указанного файла.
  4. Создание нового файла.
  5. Вывод сообщения об ошибке или об успешном выполнении операций.
  6. Закрытие файла.
  7. Вывод сообщения ОК!.
  8. Выход из программы.

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы