Добавление данных к файлу - Assembler

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

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

нужно добавть к существующему файлу сторку My file string: HELLO WORLD если файл содержал строку My file string: HELLO WORLD то теперь должен содержать My file string: HELLO WORLD My file string: HELLO WORLD Почему то не дописывает
USE16
ORG 100H
JMP start
fName       DB   'MYFILE.001',0   ; имя файла
SAddition   DB   'My file string: HELLO WORLD!'   ; текстовая строка
strSize     =    $ - SAddition       ; константа с длинной строки
buff        DB   80 DUP(0)        ; буфер 80 байт (забит нулями)
handle      DW   0                ; переменная для дескриптора файла
start:
   MOV   AL,3                  ; видеорежим 80х25/16 цветов ============//
   INT   10h
   MOV   AH,3Dh                ; открыть файл ==========================//
   MOV   AL,2                  ; режим - чтение/запись
   MOV   DX,fName              ; имя файла
   INT   21h
   MOV   [handle],AX           ; сохраняем дескриптор в переменную
   
   MOV   AH,42h                ; перемещаем указатель,
   MOV   AL,2            ;      .. на конец файла
   MOV   BX,[handle]           ; дескриптор файла
   XOR   CX,CX                 ; CX:DX = 0- смещение
   XOR   DX,DX
   INT   21h
   MOV   AH,40h                ; запись в файл =========================//
   MOV   BX,[handle]           ; дескриптор файла
   MOV   CX,strSize            ; сколько байт писАть
   MOV   DX,SAddition          ; адрес текстовой строки
   INT   21h
   MOV   AH,42h                ; перемещаем указатель,
   MOV   AL,0                  ;      .. на начало файла
   MOV   BX,[handle]           ; дескриптор файла
   XOR   CX,CX                 ; CX:DX = 0
   XOR   DX,DX
   INT   21h
   MOV   AH,3Fh                ; читать из файла =======================//
   MOV   BX,[handle]           ; дескриптор файла (от куда читать)
   MOV   DX,buff               ; буфер для приёма данных (куда читать)
   MOV   CX,strSize            ; кол-во байт для чтения
   INT   21h
   MOV   AH,3Eh                ; закрыть файл ==========================//
   MOV   BX,[handle]           ; дескриптор файла (какой файл закрыть)
   INT   21h
   MOV   AH,40h                ; выводим инфу на экран =================//
   MOV   BX,1                  ; дескриптор(1) это STDOUT (или экран)
   MOV   CX,strSize            ; сколько байт вывести
   MOV   DX,buff               ; от куда брать инфу
   INT   21h
   XOR   AX,AX                 ; ожидаем нажатия любой клавиши..
   INT   16h
   INT   20h                   ; выходим из программы! =================//

Решение задачи: «Добавление данных к файлу»

textual
Листинг программы
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          ;Вывод сообщения об ошибке    
[B][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][/B]    
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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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