Добавление пробелов между символами - Assembler
Формулировка задачи:
Здравствуйте!
Недавно начал изучать асемблер, но вот задача: считать строку с файла(input.txt), расставить между символами по 1 пробелу, и записать полученное в другой файл(output.txt).
Я не совсем понимаю как происходит формирование строки, то есть мы считати строку с файла допустим так:
Потом вообще не понятно как создать новую строку, заполнить ее и выдать в новый файл!
Помогите пожалуйста! Я по c# всем помогал, теперь мне нужна помощь по асемблеру)
Вот этот код пытаюсь изменить!
Кто-нибудь шарит в этих регистрах адресах и командах вообще? Чуваки, помогите разобраться!
_f macro f mov ah,f int 21h endm vvod proc ; Ввод записи push bp mov bp,sp push ax push bx push cx push dx mov bx,4[bp] ; N входного файла mov cx,6[bp] ; К-во вводимых байтов max mov dx,8[bp] ; Адрес входного буфера _f 3Fh ; Факт. к-во введ-х байтов -> ax mov 10[bp], ax ; Параметр - факт. к-во введ-х байтов в стек pop dx pop cx pop bx pop ax pop bp ret 6 vvod endp
;------------------------------------------------------------------------------------ ; Задача. Подсчитать максимальную длину слова входного ; текста. Слово - это последовательность символов, отличных от ; пробела. Длина текста и слова не более 80 символов. ;------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------ ; Макроопределения ; Вызов функции DOS, вызывается функция с номером f. ; Внимание! Изменяется содержимое регистра ah. _f macro f mov ah,f int 21h endm ;-------------------------------------------------------------------------- ; Вывод текста на экран ; Текст находится в памяти по адресу adr и завершается символом "$". _puts macro adr_str push ax push dx lea dx, adr_str _f 9 pop dx pop ax endm ;------------------------------------------------------------------------ assume cs:code, ds:data ; назначение регистров ; сегмента команд и сегмента данных ;------------------------------------------------------------------------ ; Сегмент данных data segment para public 'data' soob1 db 13,10,'Error open input file',13,10,'$' soob2 db 13,10,'Error create output file',13,10,'$' soob3 db 13,10,'Error read file',13,10,'$' soob4 db 13,10,'Error write file',13,10,'$' soob5 db 13,10,'Error close input file',13,10,'$' soob6 db 13,10,'Error close output file',13,10,'$' name_in db 'input.txt',0 name_out db 'output.txt',0 nom_in dw ? nom_out dw ? in_buf db 80 dup(?) out_buf db 'Max dlina slova = ' maxdl db 62 dup( ' ') data ends ;------------------------------------------------------------- ; Сегмент кода code segment para public 'code' main proc mov ax,data ; инициализация pегистpа mov ds,ax ; сегмента данных b1: lea dx,name_in ; Открытие входного файла mov al,0 _f 3Dh jnc b2 ; Файл открылся _puts soob1 ; Файл не открылся jmp v b2: mov nom_in,ax ; N вх.файла lea dx, name_out ; Открытие выходного файла mov al,1 _f 3Dh jnc b3 ; Файл открылся lea dx,name_out ; Создание выходного файла mov cx,0 _f 3Ch jnc b3 ; Создание успешное _puts soob2 ; Файл не создался jmp v2 b3: mov nom_out,ax ; N вых.файла xor ax,ax push ax ; выходной параметр - к-во введ-х байтов в стек call vvod ; Ввод записи jnc b4 ; Ввод успешный _puts soob3 ; Файл не читается jmp v1 b4: ;pop ax ; результат - к-во введ-х байтов в ах ;push ax ; входной параметр - к-во введ-х байтов lea dx,maxdl ; входной параметр – адрес результата push dx call obrab ; Обработка данных call vivod ; Вывод записи jnc v1 ; Вывод успешный _puts soob4 ; Файл не записывается v1: mov bx,nom_out ; Закрытие выходного файла _f 3Eh jnc v2 ; Закрытие успешное _puts soob6 ; Файл не закрылся v2: mov bx,nom_in ; Закрытие входного файла _f 3Eh jnc v _puts soob5 ; Файл не закрылся v: _f 4Ch ; Выход в DOS main endp vvod proc ; Ввод записи push bp mov bp,sp push ax
ЧУВАКИИИ! ! !! !
Ну кто-нибудь! Лайк поставлю!!!111
Ну хотя-бы скажите как вывести 1 символ в файл! Емае, че с этим асемблером не так? Кто-нибудь его понимает?
Тут 2 программиста сидят не могут вывести 1 сран**й символ в файл!
ААААА А А А А А А ! ! ! ! ! ! ! !
АСЕМБЛЕР СВОДИМ МЕНЯ С УМААА!!!!! Ч У В А КИ И И ИИ ИИ И И
Кто хочет кока-колу?
Может немного спайса?? ч/
ТАРАКАААНЫЫЫЫ!!!!!
Я понял что нужно создать 2ую строку, и при посимвольном обходе первой нужно добавлять текущий символ во 2ую строку и после него пробел. Но как это сделать? Как динамически заполнять строку?
Решение задачи: «Добавление пробелов между символами»
textual
Листинг программы
model small .data szMax equ 100 dbInpFN db 'input.txt',0 dbOutFN db 'output.txt',0 hndl dw ? cSize dw ? dbInp db szMax dup(?) dbOut db 2*szMax dup(?) .stack 100h .code begin: ;настраиваем сегменты mov ax,@data mov ds,ax mov es,ax ;открываем файл для чтения mov ax,3d30h lea dx,dbInpFN int 21h mov hndl,ax ;читаем данные mov ah,3fh mov bx,hndl mov cx,szMax lea dx,dbInp int 21h mov cSize,ax ;закрываем файл mov ah,3eh mov bx,hndl int 21h ; ;готовимся к форматированию строки lea si,dbInp lea di,dbOut mov cx,cSize cld mov ah,' ' ;в цикле форматируем строку @@01: lodsb stosw loop @@01 ; ;открываем файл для записи mov ah,3ch xor cx,cx lea dx,dbOutFN int 21h mov hndl,ax ;записываем данные mov ah,40h mov bx,hndl mov cx,cSize shl cx,1 lea dx,dbOut int 21h ;закрываем файл mov ah,3eh mov bx,hndl int 21h ;выход mov ax,4c00h int 21h end begin
Объяснение кода листинга программы
- Установка сегментов данных и стека
- Открытие файла input.txt для чтения
- Чтение данных из файла input.txt
- Закрытие файла input.txt
- Подготовка к форматированию строки
- Форматирование строки путем добавления пробелов между символами
- Открытие файла output.txt для записи
- Запись данных из буфера dbInp в файл output.txt
- Закрытие файла output.txt
- Выход из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д