Удалить из исходной строки повторные вхождения заданного символа. Как вывести результат на экран? - Assembler
Формулировка задачи:
Есть задание: Написать программу, удаляющую из исходной строки повторные вхождения заданного символа.
Сделал решение:
Как вывести строку с удаленным символом (т.е bcdefgh ). И правильно ли я вообще написал программу ?
data segment str1 db 'abcdefgh$' len1 = $ - str1 data ends assume cs:code,ds:data code segment start: mov ax,data mov ds,ax mov al,'c' mov di, offset str1 mov cx,len1 l1: repne scasb jnz exit ;ZF!=0 mov dx,cx mov si,di dec di mov bx,di rep movsb mov di,bx mov cx,dx jmp l1 exit: mov AH,4Ch mov AL, 0 int 21h code ends stk segment stack db 256 dup (0) stk ends end start
Решение задачи: «Удалить из исходной строки повторные вхождения заданного символа. Как вывести результат на экран?»
textual
Листинг программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
Объяснение кода листинга программы
В данном коде на языке Assembler реализуется алгоритм удаления повторных вхождений заданного символа из исходной строки. Исходная строка хранится в регистре esi, а символ, повторные вхождения которого необходимо удалить, хранится в регистре edi. Результат (измененная строка) будет сохранен в том же регистре esi. Код можно разбить на следующие этапы:
- Инициализация счетчика символов и указателя на текущий символ в исходной строке
- Пока в регистре edi есть символ, выполняем следующие действия:
- Смещаем указатель на текущий символ вперед на 1 символ
- Если в регистре edi не осталось символов, выходим из цикла
- Возвращаем в начало цикла, чтобы обработать следующую итерацию
- Повторяем шаги 2 и 3 до тех пор, пока не будет обработана вся исходная строка
- Результат (измененная строка) сохраняется в регистре esi Ниже представлен код:
- mov esi, edi
- mov ecx, len1
- while ecx != 0
- inc edi
- test byte [edi], 0
- jz short skip_loop
- mov ecx, len2
- while ecx != 0
- inc edi
- test byte [edi], 0
- jz short skip_loop2
- mov byte [edi], 0
- inc ecx
- jmp short loop
- skip_loop:
- inc edi
- jmp short loop
- skip_loop2:
- inc edi
- jmp short loop
- loop:
- mov ecx, len1
- while ecx != 0
- inc edi
- test byte [edi], 0
- jz short skip_loop
- mov byte [edi], 0
- inc ecx
- jmp short loop
- skip_loop:
- inc edi
- jmp short loop
- loop:
- ret Примечание: код представлен в упрощенном виде и не содержит обработки ошибок, таких как выход за границы строки или деление на ноль.