Открытие текстового файла - Assembler

Узнай цену своей работы

Формулировка задачи:

День добрый. Я в ассемблере разбираюсь очень плохо, но нужна программа, которая выводит ФИО, а затем открывает файл на компьютере, читает его и выводит содержимое на экран. Видел подобную тему, пытался скомпилировать приведенный в ней листинг, но компилятор находит ошибки. Ах да, для дос интел х86. Если кто-то напишет с комментариями буду очень благодарен!

Решение задачи: «Открытие текстового файла»

textual
Листинг программы
DATA SEGMENT
 path db "result.txt",0 ; имя файла для октрытия
 buf  db ?
 str_fio db 10,13, 'Ivanov Ivan', '$'
DATA ENDS
 
SSEG SEGMENT STACK
      db 200 dup(?)
SSEG ENDS
 
CODE SEGMENT
 ASSUME CS:CODE, DS:DATA, SS:SSEG
  start:
    mov ax,DATA ; настроим DS
    mov DS,ax       ; на реальный сегмент
    
    lea dx,str_fio
    mov ah,09h
    int 21h
    
    
    ;открываем файл
    mov ax,3d00h    ; открываем для чтения
    lea dx,path     ; DS:dx указатель на имя файла
    int 21h     ; в ax деcкриптор файла
    jc exit     ; если поднят флаг С, то ошибка открытия
    
    mov bx,ax       ; копируем в bx указатель файла
    xor cx,cx
    xor dx,dx
    mov ax,4200h
    int 21h     ; идем к началу файла
   out_str:
    mov ah,3fh      ; будем читать из файла
    mov cx,1        ; 1 байт
    lea dx,buf      ; в память buf
    int 21h         
    cmp ax,cx       ; если достигнуть EoF или ошибка чтения
    jnz close       ; то закрываем файл закрываем файл
    mov dl,buf
    mov ah,2        ; выводим символ в dl
    int 21h     ; на стандартное устройство вывода
    jmp out_str
   close:           ; закрываем файл, после чтения
    mov ah,3eh
    int 21h
   exit:            ; завершаем программу
    mov ah,4ch
    int 21h
CODE ENDS
  end start

Объяснение кода листинга программы

  1. Указываем сегменты данных и кода, а также сегмент стека.
  2. Задаем начальный адрес для сегмента данных.
  3. Объявляем переменные:
    • path (путь к файлу).
    • buf (буфер для чтения файла).
    • str_fio (строка, которую выводим на экран).
  4. Инициализируем сегментный регистр DS значением из регистра AX.
  5. Перемещаем указатель на сегмент данных в регистр DS.
  6. Копируем адрес файла в регистр BX.
  7. Инициализируем цикл чтения файла:
    • Вычисляем начальный адрес файла.
    • Перемещаем указатель на начало файла.
    • Читаем файл до конца или до ошибки.
    • Если произошла ошибка или достигнут конец файла, закрываем файл.
    • Выводим прочитанный символ на экран.
  8. Если файл успешно закрыт, закрываем файл.
  9. Завершаем программу.

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

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