Добавление пробелов между символами - Assembler

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

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

Здравствуйте! Недавно начал изучать асемблер, но вот задача: считать строку с файла(input.txt), расставить между символами по 1 пробелу, и записать полученное в другой файл(output.txt). Я не совсем понимаю как происходит формирование строки, то есть мы считати строку с файла допустим так:
_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
Потом вообще не понятно как создать новую строку, заполнить ее и выдать в новый файл! Помогите пожалуйста! Я по c# всем помогал, теперь мне нужна помощь по асемблеру)
;------------------------------------------------------------------------------------
;       Задача. Подсчитать максимальную длину слова входного 
; текста. Слово - это последовательность символов, отличных от
; пробела. Длина текста и слова не более 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

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

  1. Установка сегментов данных и стека
  2. Открытие файла input.txt для чтения
  3. Чтение данных из файла input.txt
  4. Закрытие файла input.txt
  5. Подготовка к форматированию строки
  6. Форматирование строки путем добавления пробелов между символами
  7. Открытие файла output.txt для записи
  8. Запись данных из буфера dbInp в файл output.txt
  9. Закрытие файла output.txt
  10. Выход из программы

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


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

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

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