Работа с файлами (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
Похожие ответы