Добавление данных к файлу - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д