Удалить из исходной строки повторные вхождения заданного символа. Как вывести результат на экран? - Assembler

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

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

Есть задание: Написать программу, удаляющую из исходной строки повторные вхождения заданного символа. Сделал решение:
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
Как вывести строку с удаленным символом (т.е bcdefgh ). И правильно ли я вообще написал программу ?

Решение задачи: «Удалить из исходной строки повторные вхождения заданного символа. Как вывести результат на экран?»

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. Код можно разбить на следующие этапы:

  1. Инициализация счетчика символов и указателя на текущий символ в исходной строке
  2. Пока в регистре edi есть символ, выполняем следующие действия:
    • Смещаем указатель на текущий символ вперед на 1 символ
    • Если в регистре edi не осталось символов, выходим из цикла
  3. Возвращаем в начало цикла, чтобы обработать следующую итерацию
  4. Повторяем шаги 2 и 3 до тех пор, пока не будет обработана вся исходная строка
  5. Результат (измененная строка) сохраняется в регистре esi Ниже представлен код:
  6. mov esi, edi
  7. mov ecx, len1
  8. while ecx != 0
    1. inc edi
    2. test byte [edi], 0
    3. jz short skip_loop
    4. mov ecx, len2
    5. while ecx != 0
    6. inc edi
    7. test byte [edi], 0
    8. jz short skip_loop2
    9. mov byte [edi], 0
    10. inc ecx
    11. jmp short loop
    12. skip_loop:
    13. inc edi
    14. jmp short loop
    15. skip_loop2:
    16. inc edi
    17. jmp short loop
    18. loop:
    19. mov ecx, len1
    20. while ecx != 0
      1. inc edi
      2. test byte [edi], 0
      3. jz short skip_loop
      4. mov byte [edi], 0
      5. inc ecx
      6. jmp short loop
      7. skip_loop:
      8. inc edi
      9. jmp short loop
      10. loop:
      11. ret Примечание: код представлен в упрощенном виде и не содержит обработки ошибок, таких как выход за границы строки или деление на ноль.

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

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