Прошу указать на ошибку - Assembler

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

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

Писал для лабы, только начал изучать ASS Задание: Из консоли считать символы и добавить в конец существующего файла Проблемы: Когда записывает в файл там всякий мусор записывается На сколько я понимаю ошибка в этом месте
mov cx,80h
mov bx,handle
mov dx,offset buffer+2        ;Пишем с самого начала буфера.
mov ah,40h
int 21h
конкретно в строке mov cx,80h потому что записываю все 80 элементов из буфера, искал в инете и наткнулся на запись типа mov cx,len где len это второй элемент массива buffer, т.к. туда кладется ко-во реально прочитанных символов, вот только когда кладу в cx этот len мне пишет что типы операндов не совпадают Посоветуйте как решить эту проблему Листинг кода:
.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

Объяснение кода листинга программы

Список элементов кода:

  1. Объявление макроса dos_inp для работы с функцией ввода/вывода в DOS.
  2. Объявление структуры _ib_ для хранения данных, введенных пользователем.
  3. Установка начального значения регистра AH для функции 0A (ввод символа).
  4. Вызов функции 21 (int 21h) для ввода строки в буфер.
  5. Открытие файла filename для чтения и записи с помощью функции 3D02 (open file).
  6. Проверка ошибки открытия файла и выход из программы при наличии ошибки.
  7. Установка указателя на конец файла с помощью функции 4202 (seek).
  8. Установка указателя на начало буфера для записи введенных данных.
  9. Запись введенных данных в файл с помощью функции 40 (write).
  10. Закрытие файла с помощью функции 3E (close file).
  11. Проверка ошибки закрытия файла и повторный выход из программы при наличии ошибки.
  12. Запуск бесконечного цикла при отсутствии ошибок.
  13. Вывод сообщения об ошибке в случае, если файл не может быть открыт или закрыт.
  14. Завершение работы программы с помощью функции 4C00 (exit).

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


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

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

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