Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > работа с файлом, дописание


Автор: FANDER69 11.10.2015, 22:36
Код

USE16
ORG 100H
JMP start
     s_pak     db 'Press any key...$'
     s_error1   db 'Error!1',13,10,'$'
     s_error2  db 'Error!2',13,10,'$'
     s_error3   db 'Error!3',13,10,'$'
     s_error4   db 'Error!4',13,10,'$'
     s_file    db '----[ file "do dabavlenia" ]$'
     p_file    db '----[ file "posle dabavlenia" ]$'
     endline   db 13,10,'$'     
     Fname     db      'MYFILE.001',0
       SAddition db      13,10,'asmworld',13,10,'Hello!$'
     Strsize  =    $ - SAddition
     buffer    db      180 DUP(0)
     handle    dw      0               
start:
    mov  dx,Fname 
    mov  al,2
    mov  ah,3DH
    int  21h
    jnc  @F               ;Если нет ошибки, то продолжаем
    call error_msg1          ;Иначе вывод сообщения об ошибке
    jmp exit                ;Выход из программы
@@: mov [handle],ax         ;Сохранение дескриптора файла
;-----------------------------------------------------------------------
    mov bx,ax               ;Дескриптор файла
    mov ah,3Fh              ;Функция DOS 3Fh (чтение из файла)
    mov dx,buffer           ;Адрес буфера для данных
    mov cx,80               ;Максимальное кол-во читаемых байтов
    int 21h                 ;Обращение к функции DOS
    jnc otput_ekran                  ;Если нет ошибки, то продолжаем
    call error_msg1          ;Вывод сообщения об ошибке
    jmp close_file          ;Закрыть файл и выйти из программы
;-------------------------------------------------------------------------
otput_ekran:
    mov bx,buffer
    add bx,ax               ;В AX количество прочитанных байтов
    mov byte[bx],'$'        ;Добавление символа '$'
 
    mov ah,9
    mov dx,s_file
    int 21h                 ;Вывод строки с именем файла
 
    mov cx,52
    call line               ;Вывод линии
 
    mov ah,9
    mov dx,buffer
    int 21h                 ;Вывод содержимого файла
    mov dx,endline
    int 21h                 ;Вывод перехода на новую строку
 
    mov cx,80
    call line               ;Вывод линии
;-----------------------------------------------------------------    
sdvig:    
    mov     ah,42H          ;СДВИНУТЬ УКАЗАТЕЛЬ ФАЙЛА(ФУНКЦИЯ 42Н) 
    mov     bx,[handle]
    xor     cx,cx
    xor     dx,dx
    mov     al,2
    int     21h
    jnc  @@@                ;Если нет ошибки, то продолжаем
    call error_msg2          ;Иначе вывод сообщения об ошибке
    jmp exit                ;Выход из программы
@@@:
    mov bx,[handle]               ;Дескриптор файла
    mov ah,40h              ;Функция DOS 40h (запись в файл)
    mov dx,SAddition        ;Адрес буфера с данными
    mov cx, Strsize       ;Размер данных
    int 21h                 ;Обращение к функции DOS
    jnc chtenie2          ;Если нет ошибки, то далее
    call error_msg3          ;Вывод сообщения об ошибке    
[COLOR="Red"];-----------------------------------------------------------------------
chtenie2:
    mov bx,[handle]              ;Дескриптор файла
    mov ah,3Fh              ;Функция DOS 3Fh (чтение из файла)
    mov dx,buffer           ;Адрес буфера для данных
    mov cx,80               ;Максимальное кол-во читаемых байтов
    int 21h                 ;Обращение к функции DOS
    jnc otput_ekran1                  ;Если нет ошибки, то продолжаем
    call error_msg1          ;Вывод сообщения об ошибке
    jmp close_file          ;Закрыть файл и выйти из программы
;-------------------------------------------------------------------------
otput_ekran1:
    mov bx,buffer
    add bx,ax               ;В AX количество прочитанных байтов
    mov byte[bx],'$'        ;Добавление символа '$'
 
    mov ah,9
    mov dx,p_file
    int 21h                 ;Вывод строки с именем файла
 
    mov cx,49
    call line               ;Вывод линии
 
    mov ah,9
    mov dx,buffer
    int 21h                 ;Вывод содержимого файла
    mov dx,endline
    int 21h                 ;Вывод перехода на новую строку
 
    mov cx,80
    call line               ;Вывод линии
;----------------------------------------------------------------- [/COLOR]
    
close_file:
    mov ah,3Eh              ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle]         ;Дескриптор
    int 21h                 ;Обращение к функции DOS
    jnc exit                ;Если нет ошибки, то выход из программы
    call error_msg4          ;Вывод сообщения об ошибке
 
exit:
    mov ah,9
    mov dx,s_pak
    int 21h                 ;Вывод строки 'Press any key...'
    mov ah,8                ;\
    int 21h                 ;/ Ввод символа без эха
    mov ax,4C00h            ;\
    int 21h                 ;/ Завершение программы 
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg1:
    mov ah,9
    mov dx,s_error1
    int 21h                 ;Вывод сообщения об ошибке
    ret
error_msg2:
    mov ah,9
    mov dx,s_error2
    int 21h                 ;Вывод сообщения об ошибке
    ret
error_msg3:
    mov ah,9
    mov dx,s_error3
    int 21h                 ;Вывод сообщения об ошибке
    ret
error_msg4:
    mov ah,9
    mov dx,s_error3
    int 21h                 ;Вывод сообщения об ошибке
    ret
;-------------------------------------------------------------------------------
; Вывод линии
; CX - количество символов
line:
    mov ah,2                ;Функция DOS 02h (вывод символа)
    mov dl,'-'              ;Символ
@@: int 21h                 ;Обращение к функции DOS
    loop @B                 ;Команда цикла
    ret

опять возникла ошибка при выоде на экран первое прочитанное (до добавления) выводит хорошо, а вот второе вообще не выодит (после добавления)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)