Нужно из строки удалить буквы а и буквы 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
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Задаётся модель памяти, в данном случае small, и сегментный регистр данных ds равным сегменту данных.
- Указывается, что в стеке будет 100h байт.
- Определяется строка mytext, в которой содержится 'ababab'.
- Вычисляется длина строки mytext (len) равная 6.
- Задаются начальные условия для поиска первого вхождения символа 'a'.
- В цикле search происходит поиск первого вхождения символа 'a' с помощью инструкции repne scasb (поиск с учётом регистра, не включая символ 'a' в результат).
- Если символ 'a' не найден (jz next), то происходит переход к следующей итерации цикла.
- Если символ 'a' найден, то выполняется цикл shift, в котором происходит замена символов 'ab' на 'BB'.
- После завершения цикла shift, происходит переход к следующей итерации цикла search.
- Если все символы 'a' были заменены, то выполняется цикл change, в котором происходит поиск первого вхождения символа 'b'.
- Если символ 'b' не найден (je exit), то происходит переход к следующей итерации цикла change.
- Если символ 'b' найден, то выполняется замена символа 'b' на 'B'.
- После завершения цикла change, происходит переход к следующей итерации цикла search.
- Если все символы 'b' были заменены, то программа завершается.
- Если не все символы 'b' были заменены, то происходит переход к следующей итерации цикла search.
- Если не все символы 'a' были заменены, то происходит переход к следующей итерации цикла search.
- Если не все символы 'a' были заменены, то происходит переход к следующей итерации цикла change.
- Если не все символы 'b' были заменены, то происходит переход к следующей итерации цикла change.
- Если не все символы 'b' были заменены, то программа завершается.
- Если не все символы 'a' были заменены, то программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д