Прошу указать на ошибку - Assembler
Формулировка задачи:
Писал для лабы, только начал изучать ASS
Задание: Из консоли считать символы и добавить в конец существующего файла
Проблемы:
Когда записывает в файл там всякий мусор записывается
На сколько я понимаю ошибка в этом месте
конкретно в строке mov cx,80h потому что записываю все 80 элементов из буфера, искал в инете и наткнулся на запись типа mov cx,len где len это второй элемент массива buffer, т.к. туда кладется ко-во реально прочитанных символов, вот только когда кладу в cx этот len мне пишет что типы операндов не совпадают
Посоветуйте как решить эту проблему
Листинг кода:
mov cx,80h mov bx,handle mov dx,offset buffer+2 ;Пишем с самого начала буфера. mov ah,40h int 21h
.model small .data handle dw 0 buffer db 80 dup(0) filename db 'file.txt',0 .code start: mov ax, @data mov ds, ax mov AH,0aH mov dx,offset buffer int 21h mov ax,3D02h ;Откроем файл для чтения/записи. mov dx,offset filename ;4 строки открытие на запись чтение int 21h ; jc exit ;При ошибке - на выход... mov handle,ax ; mov bx,handle ; mov ax,4202h ;Установим указатель на конец файла. xor cx,cx xor dx,dx int 21h ; mov cx,80h mov bx,handle mov dx,offset buffer+2 ;Пишем с самого начала буфера. mov ah,40h int 21h mov ah,3Eh ;3 строки на закрытие mov bx,handle ; int 21h ; jmp exit exit: mov ax,4c00h int 21h end start
Решение задачи: «Прошу указать на ошибку»
textual
Листинг программы
.model small .stack 100h .data dos_inp macro lbl, sz _ib_ struc max db sz ; наибольшая длина строки len db ? ; сюда вернется настоящая длина bf db sz dup(?) ; тут будет то, что ввели _ib_ ends lbl _ib_ <> endm handle dw 0 dos_inp buffer, 80 ;buffer db 80 dup(0) filename db 'file.txt',0 .code start: mov ax, @data mov ds, ax mov AH,0aH mov dx,offset buffer int 21h mov ax,3D02h ;Откроем файл для чтения/записи. mov dx,offset filename ;4 строки открытие на запись чтение int 21h ; jc exit ;При ошибке - на выход... mov handle,ax ; mov bx,handle ; mov ax,4202h ;Установим указатель на конец файла. xor cx,cx xor dx,dx int 21h ; ; mov cx,80h mov cl, buffer.len xor ch, ch mov bx,handle mov dx,offset buffer.bf ;Пишем с самого начала буфера. mov ah,40h int 21h mov ah,3Eh ;3 строки на закрытие mov bx,handle ; int 21h ; jmp exit exit: mov ax,4c00h int 21h end start
Объяснение кода листинга программы
Список элементов кода:
- Объявление макроса
dos_inp
для работы с функцией ввода/вывода в DOS. - Объявление структуры
_ib_
для хранения данных, введенных пользователем. - Установка начального значения регистра AH для функции 0A (ввод символа).
- Вызов функции 21 (int 21h) для ввода строки в буфер.
- Открытие файла
filename
для чтения и записи с помощью функции 3D02 (open file). - Проверка ошибки открытия файла и выход из программы при наличии ошибки.
- Установка указателя на конец файла с помощью функции 4202 (seek).
- Установка указателя на начало буфера для записи введенных данных.
- Запись введенных данных в файл с помощью функции 40 (write).
- Закрытие файла с помощью функции 3E (close file).
- Проверка ошибки закрытия файла и повторный выход из программы при наличии ошибки.
- Запуск бесконечного цикла при отсутствии ошибок.
- Вывод сообщения об ошибке в случае, если файл не может быть открыт или закрыт.
- Завершение работы программы с помощью функции 4C00 (exit).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д