Чтение и вывод содержимого файла - Assembler

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

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

Мне надо вывести содержимое файла.
; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt
 
org 100h

    mov ah,3dh; Funkciya OPEN
    mov al,2  ; Dostup dlya chteniya i zapisi
    mov dx, offset Filename; Adres imeni fayla
    int 21h
    
    ;Analiz sys oshibok
     
    cycle: 
    ;Chitaem 80 bayt
    mov Handler, ax  ;Sohranenie deskriptora
    mov ah, 3fh ; Funkciya READ
    mov bx, Handler ; Deskriptor 
    mov cx, 80 ; Skol'ko chitat'
    mov dx, offset BufIn ; Suda chitat'
    int 21h 
    
    cmp ax,si
    je end
    
    mov cx, ax ; Skol'ko prochitano  
    
    ;vivod prochitannogo na ekran 
    
    mov ah, 40h ;  Funkciya WRITE
    mov bx, 1 ; Deskriptor standartnogo vivoda
    mov dx, offset BufIn ; Otsuda vivodit'
    int 21h  
    jmp cycle
    end:
    mov ax,4c00h
    int 21h
         
BufIn db 80 dup ('') ; bufer vivoda
Handler dw ?  
Filename db 'a:\mycode1.asm',0        
ret
Я только начал изучать файлы, поэтому не знаю некоторых тонкостей. Для вывода я просто зациклил программу. А на выходе получил: 1) Программа читает и выводит 80 символов 2) Что-то снова читает и выводит пару символов, причём первый это "P" И так до тех пор, пока файл не закончится. И я никак не могу понять, почему на каждом втором чтении файла выводится непонятный мусор?

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

textual
Листинг программы
ORG 100h
JMP  start
 
buff   DB  80 DUP(' ')     ; bufer vivoda
fName  DB  'mycode1.asm',0
 
start:
    MOV   AX,3D02h        ; OPEN (read/write)
    MOV   DX,fName        ; File name
    INT   21h
    XCHG  BX,AX           ; BX = handle
 
    MOV   AH,3Fh          ; READ
    MOV   CX,0FFFFh       ; Skol'ko chitat' (max)
    MOV   DX,buff         ; Suda chitat'
    INT   21h
    MOV   CX,AX           ; Real'no  prochitano
    
    MOV   AH,3Eh          ; CLOSE
    INT   21h
 
    MOV   AH,40h          ; WRITE
    MOV   BX,1            ; STDOUT
    MOV   DX,buff
    INT   21h
 
exit:
    XOR   AX,AX
    INT   16h
    INT   20h

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

  1. Объявление переменных: — buff DB 80 DUP(' ') — буфер для чтения файла — fName DB 'mycode1.asm',0 — имя файла
  2. Код для открытия файла: — MOV AX,3D02h — код операции открытия файла для чтения и записи — MOV DX,fName — перемещение имени файла в регистр DX — INT 21h — вызов функции BIOS для работы с диском
  3. Код для чтения файла: — MOV AH,3Fh — код операции чтения из файла — MOV CX,0FFFFh — количество байт для чтения (максимум) — MOV DX,buff — перемещение адреса буфера в регистр DX — INT 21h — вызов функции BIOS для чтения из файла
  4. Код для закрытия файла: — MOV AH,3Eh — код операции закрытия файла — INT 21h — вызов функции BIOS для работы с диском
  5. Код для записи в файл: — MOV AH,40h — код операции записи в файл — MOV BX,1 — указание на STDOUT (1) — MOV DX,buff — перемещение адреса буфера в регистр DX — INT 21h — вызов функции BIOS для записи в файл
  6. Код для выхода из программы: — XOR AX,AX — очистка регистра AX — INT 16h — вызов функции BIOS для работы с клавиатурой — INT 20h — вызов функции BIOS для завершения работы программы

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

8   голосов , оценка 4.5 из 5