Открыть файл, найти в нём все открывающие и закрывающие скобки и заменить их на 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 '
Объяснение кода листинга программы
В данном коде выполняется следующая последовательность действий:
- Задаются начальные значения для двух регистров: CX (длина файла) и SI (начальный адрес буфера для чтения).
- Выполняется цикл, в котором происходит чтение содержимого файла по 1 символу и проверка, является ли текущий символ открывающей скобкой.
- Если текущий символ является открывающей скобкой, то выполняется следующий блок кода: регистры CX и SI сохраняются на стеке, значение CX изменяется на 6, а SI перенаправляется на метку @open. Затем выполняется команда REP MOVSB, которая заменяет содержимое регистра SI на строку
Begin
(илиEnd
в случае с закрывающей скобкой). После этого регистры SI и CX восстанавливаются из стека. - Если текущий символ не является открывающей скобкой, то выполняется цикл проверки следующего символа.
- Если следующий символ является закрывающей скобкой, то выполняется аналогичный блок кода, как и в пункте 3, но с использованием метки @close.
- Если следующий символ не является закрывающей скобкой, то выполняется цикл проверки следующего символа.
- Если в процессе выполнения цикла не было найдено ни одной открывающей или закрывающей скобки, то выполняется цикл проверки следующего символа.
- После выхода из цикла с меткой @next, выполняется проверка, была ли найдена открывающая скобка. Если была, то выполняется переход на метку @01. Если открывающая скобка не была найдена, то выполняется переход на метку @exit.
- Если была найдена закрывающая скобка без соответствующей открывающей скобки, то выполняется переход на метку @02. Если закрывающая скобка не была найдена, то выполняется переход на метку @exit.
- В блоке кода с меткой @02 выполняется поиск открывающей скобки. Если она не найдена, то выполняется бесконечный цикл.
- После выхода из цикла с меткой @02, выполняется переход на метку @exit.
- В блоке кода с меткой @exit выполняется команда NOP, которая представляет собой пустую операцию. Это может быть необходимо для корректного завершения работы программы.
В секции данных определены буферы для чтения и записи, а также строки
Begin
иEnd
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д