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

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

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

Может, кто помочь с заданием? Дана строка "abababababababababababab" нужно буквы а удалить, буквы b поменять на B заглавную. Код взят из учебника, сказали по нему работать. С буквой b всё работает. Но не могу удалить а со строки. Может, кто помочь? или подсказать!!!
DATASG SEGMENT PARA
    MYTEXT DB   'abababababababababababab' ,13,10, '$'
DATASG ENDS
 
STACKSG SEGMENT 'Stack'     
    DB 12 DUP(?)
STACKSG ENDS
 
CODESG SEGMENT PARA 'Code'
    
BEGIN PROC FAR
    ASSUME SS:STACKSG, CS:CODESG, DS:DATASG
    PUSH DS             ; сохраняем сегмент данных в стек
    SUB AX, AX          ; Обнуляем AX
    PUSH AX             ; сохраняем содержимое АХ в стек
    MOV AX, DATASG      ; заносим в сегментный
    MOV DS, AX          ; регистр DS адрес сегмента данных
    LEA BX, MYTEXT      ; заносим в BX адрес начального символа переменной Mytext
    MOV CX, 19H         ; Вносим в СХ значение 17Н - параметр цикла
    
    MOV AH, 09H             ;
    MOV DX, OFFSET MYTEXT   ;
    INT 21H                 ; вывода на экран
 
    MT1:    
        MOV AH, [BX]    ; Метка1: заносим в АН код первого символа переменной Mytext
        CMP AH, 62H     ; Сравниваем значения регистра AH и кода символа 41Н (символа A)
        JB MT2          ; преход к метке 2 если код, лежащий в AH больше 41H (символ старше A в таблице ASCII)
        CALL COR        ; вызов процедуры COR
        CMP AH, 62H     ; Сравниваем значения регистра AH и кода символа 5АН (символа Z)
        JA MT2          ; преход к метке 2 если код, лежащий в AH меньше 5АH (символ младше Z в таблице ASCII)
 
    MT2:
        INC BX          ; Метка 2: увеличиваем значение в BX на 1
        LOOP MT1        ; Цикл с параметром, лежащим в СХ, передающий управление коду под меткой 1.
        LEA DX, MYTEXT  ; Заносим в DX адрес переменной MYTEXT для вывода на экран
        MOV AH, 09H     ; оформляем функцию DOS
        INT 21H         ; вывода на экран
        RET             ; воврат
        
BEGIN ENDP
    
COR PROC NEAR           ; Начало процедуры COR
    NOP                 ; пауза
    SUB AH, 20H         ; прибавляем к коду символа смещение 20H по таблице ASCII
    MOV [BX], AH        ; занесение в ячейку с адресом, лежащим в BX, кода символа из AH
    RET                 ; воврат 
COR ENDP                ; завершение процедуры
 
CODESG ENDS
END BEGIN

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

textual
Листинг программы
.model small
.386
 
.stack 100h
 
.data
mytext db 'ababab'
len equ $-mytext
 
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
 
cld
mov al,'a'
lea si,mytext
mov cx,len
search:
repne scasb
 
or cx,cx
jz next
 
push di
push cx
 
shift:
mov ah,byte ptr [di]
mov byte ptr [di-1],ah
 
inc di
loop shift
 
pop cx
 
dec di
 
mov byte ptr [di],'$'
 
pop di
dec di
 
jmp search 
 
next:
lea si,mytext
change:
lodsb
 
cmp al,'$'
je exit
 
cmp al,'b'
jne skip
 
mov byte ptr [si-1],'B'
 
skip:
jmp change 
 
exit:
mov ah,4Ch
mov al,00h
int 21h
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
Похожие ответы