Нужно из строки удалить буквы а и буквы b поменять B заглавные - Assembler

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

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

Может, кто помочь с заданием? Дана строка "abababababababababababab" нужно буквы а удалить, буквы b поменять на B заглавную. Код взят из учебника, сказали по нему работать. С буквой b всё работает. Но не могу удалить а со строки. Может, кто помочь? или подсказать!!!
Листинг программы
  1. DATASG SEGMENT PARA
  2. MYTEXT DB 'abababababababababababab' ,13,10, '$'
  3. DATASG ENDS
  4. STACKSG SEGMENT 'Stack'
  5. DB 12 DUP(?)
  6. STACKSG ENDS
  7. CODESG SEGMENT PARA 'Code'
  8. BEGIN PROC FAR
  9. ASSUME SS:STACKSG, CS:CODESG, DS:DATASG
  10. PUSH DS ; сохраняем сегмент данных в стек
  11. SUB AX, AX ; Обнуляем AX
  12. PUSH AX ; сохраняем содержимое АХ в стек
  13. MOV AX, DATASG ; заносим в сегментный
  14. MOV DS, AX ; регистр DS адрес сегмента данных
  15. LEA BX, MYTEXT ; заносим в BX адрес начального символа переменной Mytext
  16. MOV CX, 19H ; Вносим в СХ значение 17Н - параметр цикла
  17. MOV AH, 09H ;
  18. MOV DX, OFFSET MYTEXT ;
  19. INT 21H ; вывода на экран
  20. MT1:
  21. MOV AH, [BX] ; Метка1: заносим в АН код первого символа переменной Mytext
  22. CMP AH, 62H ; Сравниваем значения регистра AH и кода символа 41Н (символа A)
  23. JB MT2 ; преход к метке 2 если код, лежащий в AH больше 41H (символ старше A в таблице ASCII)
  24. CALL COR ; вызов процедуры COR
  25. CMP AH, 62H ; Сравниваем значения регистра AH и кода символа 5АН (символа Z)
  26. JA MT2 ; преход к метке 2 если код, лежащий в AH меньше 5АH (символ младше Z в таблице ASCII)
  27. MT2:
  28. INC BX ; Метка 2: увеличиваем значение в BX на 1
  29. LOOP MT1 ; Цикл с параметром, лежащим в СХ, передающий управление коду под меткой 1.
  30. LEA DX, MYTEXT ; Заносим в DX адрес переменной MYTEXT для вывода на экран
  31. MOV AH, 09H ; оформляем функцию DOS
  32. INT 21H ; вывода на экран
  33. RET ; воврат
  34. BEGIN ENDP
  35. COR PROC NEAR ; Начало процедуры COR
  36. NOP ; пауза
  37. SUB AH, 20H ; прибавляем к коду символа смещение 20H по таблице ASCII
  38. MOV [BX], AH ; занесение в ячейку с адресом, лежащим в BX, кода символа из AH
  39. RET ; воврат
  40. COR ENDP ; завершение процедуры
  41. CODESG ENDS
  42. END BEGIN

Решение задачи: «Нужно из строки удалить буквы а и буквы b поменять B заглавные»

textual
Листинг программы
  1. .model small
  2. .386
  3.  
  4. .stack 100h
  5.  
  6. .data
  7. mytext db 'ababab'
  8. len equ $-mytext
  9.  
  10. .code
  11. start:
  12. mov ax,@data
  13. mov ds,ax
  14. mov es,ax
  15.  
  16. cld
  17. mov al,'a'
  18. lea si,mytext
  19. mov cx,len
  20. search:
  21. repne scasb
  22.  
  23. or cx,cx
  24. jz next
  25.  
  26. push di
  27. push cx
  28.  
  29. shift:
  30. mov ah,byte ptr [di]
  31. mov byte ptr [di-1],ah
  32.  
  33. inc di
  34. loop shift
  35.  
  36. pop cx
  37.  
  38. dec di
  39.  
  40. mov byte ptr [di],'$'
  41.  
  42. pop di
  43. dec di
  44.  
  45. jmp search
  46.  
  47. next:
  48. lea si,mytext
  49. change:
  50. lodsb
  51.  
  52. cmp al,'$'
  53. je exit
  54.  
  55. cmp al,'b'
  56. jne skip
  57.  
  58. mov byte ptr [si-1],'B'
  59.  
  60. skip:
  61. jmp change
  62.  
  63. exit:
  64. mov ah,4Ch
  65. mov al,00h
  66. int 21h
  67. end start

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

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

  1. Задаётся модель памяти, в данном случае small, и сегментный регистр данных ds равным сегменту данных.
  2. Указывается, что в стеке будет 100h байт.
  3. Определяется строка mytext, в которой содержится 'ababab'.
  4. Вычисляется длина строки mytext (len) равная 6.
  5. Задаются начальные условия для поиска первого вхождения символа 'a'.
  6. В цикле search происходит поиск первого вхождения символа 'a' с помощью инструкции repne scasb (поиск с учётом регистра, не включая символ 'a' в результат).
  7. Если символ 'a' не найден (jz next), то происходит переход к следующей итерации цикла.
  8. Если символ 'a' найден, то выполняется цикл shift, в котором происходит замена символов 'ab' на 'BB'.
  9. После завершения цикла shift, происходит переход к следующей итерации цикла search.
  10. Если все символы 'a' были заменены, то выполняется цикл change, в котором происходит поиск первого вхождения символа 'b'.
  11. Если символ 'b' не найден (je exit), то происходит переход к следующей итерации цикла change.
  12. Если символ 'b' найден, то выполняется замена символа 'b' на 'B'.
  13. После завершения цикла change, происходит переход к следующей итерации цикла search.
  14. Если все символы 'b' были заменены, то программа завершается.
  15. Если не все символы 'b' были заменены, то происходит переход к следующей итерации цикла search.
  16. Если не все символы 'a' были заменены, то происходит переход к следующей итерации цикла search.
  17. Если не все символы 'a' были заменены, то происходит переход к следующей итерации цикла change.
  18. Если не все символы 'b' были заменены, то происходит переход к следующей итерации цикла change.
  19. Если не все символы 'b' были заменены, то программа завершается.
  20. Если не все символы 'a' были заменены, то программа завершается.

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


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

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

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы