Открыть файл, найти в нём все открывающие и закрывающие скобки и заменить их на begin и end - Assembler/TASM

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

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

Необходимо открыть в файл, найти в нём все открывающие и закрывающие скобки и заменить их на begin и end. Помогите, пожалуйста

Решение задачи: «Открыть файл, найти в нём все открывающие и закрывающие скобки и заменить их на begin и end»

textual
Листинг программы
;fasm-code
;-----------
start:  mov   cx,len           ; длина файла
        mov   si,iBuff         ; источник
        mov   di,oBuff         ; приёмник
@find:  lodsb                  ; читаем содержимое..
        cmp   al,'{'           ; откр.скобка?
        jne   @next
        push  cx si            ; если да!
        mov   cx,6
        mov   si,@open 
        rep   movsb            ; заменить строкой
        pop   si cx
 
@01:    lodsb                  ; искать закр.скобку..
        cmp   al,'}'
        jne   @02
        push  cx si            ; нашли
        mov   cx,4
        mov   si,@close
        rep   movsb            ; заменить строкой
        pop   si cx 
        jmp   @next
@02:    stosb                  ; если не закр.скобка
        loop  @01              ;   ..искать её дальше
        jmp   @exit
 
@next:  stosb                  ; если не откр.скобка..
        loop  @b               ;   ..искать её дальше
 
@exit:  nop                    ; конец! (перезапись файла)
 
; в секции данных
;-----------------------
iBuff   db   4000h dup(0)      ; от сюда берём (16K буфер)
oBuff   db   4000h dup(0)      ; сюда кидаем
@open   db   'Begin '          
@close  db   'End '

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

В данном коде выполняется следующая последовательность действий:

  1. Задаются начальные значения для двух регистров: CX (длина файла) и SI (начальный адрес буфера для чтения).
  2. Выполняется цикл, в котором происходит чтение содержимого файла по 1 символу и проверка, является ли текущий символ открывающей скобкой.
  3. Если текущий символ является открывающей скобкой, то выполняется следующий блок кода: регистры CX и SI сохраняются на стеке, значение CX изменяется на 6, а SI перенаправляется на метку @open. Затем выполняется команда REP MOVSB, которая заменяет содержимое регистра SI на строку Begin (или End в случае с закрывающей скобкой). После этого регистры SI и CX восстанавливаются из стека.
  4. Если текущий символ не является открывающей скобкой, то выполняется цикл проверки следующего символа.
  5. Если следующий символ является закрывающей скобкой, то выполняется аналогичный блок кода, как и в пункте 3, но с использованием метки @close.
  6. Если следующий символ не является закрывающей скобкой, то выполняется цикл проверки следующего символа.
  7. Если в процессе выполнения цикла не было найдено ни одной открывающей или закрывающей скобки, то выполняется цикл проверки следующего символа.
  8. После выхода из цикла с меткой @next, выполняется проверка, была ли найдена открывающая скобка. Если была, то выполняется переход на метку @01. Если открывающая скобка не была найдена, то выполняется переход на метку @exit.
  9. Если была найдена закрывающая скобка без соответствующей открывающей скобки, то выполняется переход на метку @02. Если закрывающая скобка не была найдена, то выполняется переход на метку @exit.
  10. В блоке кода с меткой @02 выполняется поиск открывающей скобки. Если она не найдена, то выполняется бесконечный цикл.
  11. После выхода из цикла с меткой @02, выполняется переход на метку @exit.
  12. В блоке кода с меткой @exit выполняется команда NOP, которая представляет собой пустую операцию. Это может быть необходимо для корректного завершения работы программы. В секции данных определены буферы для чтения и записи, а также строки Begin и End.

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


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

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

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