Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2024, 21:48   #1
Aborigen8243
Новичок
Джуниор
 
Регистрация: 26.11.2024
Сообщений: 1
По умолчанию Запись нескольких строк в файл TASM

Всем привет, в вузе начался ассемблер, все одногруппники его успешно сдали, остался я один такой, и никто не хочет помогать.
Необходимо записать в файл строки с каким либо содержанием, вот что у меня получилось:
Код:
.model tiny
.386
.data
    ; Имя файла для записи
    filename DB 'output.txt', 0
    ; Буфер для ввода строки
    inputBuffer db 255      ; Максимальная длина строки - 255
    inputLength db ?       ; Содержит фактическую длину введённой строки
    fileHandle DW ?           ; Дескриптор файла
    newline db '',0dh,0ah,'$'
    prompt DB 'Vvedite stroky (dlya zavershemiya Enter): $'
    errMsg DB 'File ne sushestvuyet!$'
.code
org 100h
MAIN:
    ; Установка сегментов
    MOV AX, @DATA
    MOV DS, AX

    ; Открываем файл на запись
    xor ax, ax
    MOV AH, 3dh         ; Функция INT 21h - открыть файл
    MOV AL, 0
    XOR CX, CX           ; Атрибут файла - обычный
    mov DX, offset filename    ; Имя файла
    INT 21h
    JC FILE_ERROR       ; Если ошибка - переход к FILE_ERROR
    MOV fileHandle, AX  ; Сохраняем дескриптор файла

INPUT_LOOP:
    ; Вывод приглашения для ввода строки
    MOV AH, 9
    mov DX, offset prompt
    INT 21h

    ; Считываем строку с консоли
    MOV AH, 0Ah         ; Функция INT 21h - ввод строки
    xor di,di
    mov DX, offset inputBuffer
    INT 21h
    

    MOV AH, 9
    mov DX, offset inputBuffer
    INT 21h
    MOV AH, 9
    mov DX, offset newline
    INT 21h


    ; Проверка длины введённой строки
    MOV AL, inputBuffer+1 ; Длина введённой строки (1 байт)
    CMP AL, 0             ; Пользователь нажал только Enter?
    JE EXIT               ; Если да, завершить ввод

    MOV inputLength, AL   ; Сохраняем длину строки
    xor al, al

    ; Записываем строку в файл
    xor cx, cx
    MOV CL, inputBuffer+1
    MOV DX, offset inputBuffer+2   ; Указатель на начало строки
    MOV BX, fileHandle      ; Дескриптор файла
    MOV AH, 40h             ; Функция INT 21h - запись в файл
    INT 21h

    ; Записываем символ новой строки (CR+LF)
    mov DX, offset newline         ; Указатель на CR+LF
    xor cx, cx
    MOV CL, 2              ; Длина CR+LF
    MOV BX, fileHandle      ; Дескриптор файла
    MOV AH, 40h             ; Функция INT 21h - запись в файл
    INT 21h

    JMP INPUT_LOOP          ; Повторяем ввод строки

EXIT:
    ; Закрываем файл
    MOV AH, 3Eh         ; Функция INT 21h - закрыть файл
    MOV BX, fileHandle  ; Дескриптор файла
    INT 21h

    ; Завершение программы
    MOV AH, 4Ch
    INT 21h

FILE_ERROR:
    ; Обработчик ошибки при открытии файла
    MOV AH, 9
    LEA DX, errMsg
    INT 21h
    JMP EXIT

SSEG segment stack
    db 400h dup (?)
SSEG ends
END MAIN
Не понимаю почему оно багается и файл остается пустым, прошу помощи у знатоков

Последний раз редактировалось BDA; 27.11.2024 в 00:19.
Aborigen8243 вне форума Ответить с цитированием
Старый 27.11.2024, 20:37   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 473
По умолчанию

Вы под буфер ввода не выделили место - только под первых два поля (размеры максимальный и фактический). Поэтому при вводе строки символы помещаются не в буфер (массив), а в память сразу после переменной inputLength - т.е. затирает и fileHandle и всё, что после - даже часть программы.
Объявите сам буфер на 256 элементов.

Кроме того, открытие файла на запись - это ah=3ch, а ah=3dh это открытие для чтения.
Другие параметры посмотрите в методичке, учебнике, примерах или в справочнике
http://www.ctyme.com/intr/int-21.htm

Для контрольного вывода на экран буфера ввода использовать ah=09h неудобно - нужно записывать в конец строки ограничитель (символ '$'). Проще вывести той же файловой функцией ah=40h но с bx=2 (это дескриптор файла - консольного экрана). А перевод строки - пусть уже и ah=09h.

Последний раз редактировалось FPaul; 27.11.2024 в 20:57.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tasm Написать программу для вывода на экран нескольких строк символов. ChestIotVaga Помощь студентам 3 22.02.2023 14:30
Запись строк в файл С++ zrtw Помощь студентам 0 22.12.2011 21:39
tasm. запись результата в .txt файл квант Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 15.12.2011 00:37
assembler.tasm. Запись результата в файл .txt квант Помощь студентам 0 15.12.2011 00:12
Задачи: Сортировка символьной информации в строке, заданной пользователем.; Чтение и запись данных в файл (Assembler,TASM) User22 Помощь студентам 2 01.12.2011 11:40