Чтение и вывод содержимого файла - Assembler
Формулировка задачи:
Мне надо вывести содержимое файла.
Я только начал изучать файлы, поэтому не знаю некоторых тонкостей.
Для вывода я просто зациклил программу. А на выходе получил:
1) Программа читает и выводит 80 символов
2) Что-то снова читает и выводит пару символов, причём первый это "P"
И так до тех пор, пока файл не закончится.
И я никак не могу понять, почему на каждом втором чтении файла выводится непонятный мусор?
; 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
Решение задачи: «Чтение и вывод содержимого файла»
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
Объяснение кода листинга программы
- Объявление переменных: — buff DB 80 DUP(' ') — буфер для чтения файла — fName DB 'mycode1.asm',0 — имя файла
- Код для открытия файла: — MOV AX,3D02h — код операции открытия файла для чтения и записи — MOV DX,fName — перемещение имени файла в регистр DX — INT 21h — вызов функции BIOS для работы с диском
- Код для чтения файла: — MOV AH,3Fh — код операции чтения из файла — MOV CX,0FFFFh — количество байт для чтения (максимум) — MOV DX,buff — перемещение адреса буфера в регистр DX — INT 21h — вызов функции BIOS для чтения из файла
- Код для закрытия файла: — MOV AH,3Eh — код операции закрытия файла — INT 21h — вызов функции BIOS для работы с диском
- Код для записи в файл: — MOV AH,40h — код операции записи в файл — MOV BX,1 — указание на STDOUT (1) — MOV DX,buff — перемещение адреса буфера в регистр DX — INT 21h — вызов функции BIOS для записи в файл
- Код для выхода из программы: — XOR AX,AX — очистка регистра AX — INT 16h — вызов функции BIOS для работы с клавиатурой — INT 20h — вызов функции BIOS для завершения работы программы