Во введенной строке подсчитать количество гласных символов - Assembler
Формулировка задачи:
Делаю семестровку. Задание такое: разработать программу на языке Ассемблера Интелx86 для ДОС. Модель памяти – не регламентируется. Все числа – однозначные (от 0 до 9). Для проверки на гласные, согласные, простые числа и т.д. использовать конструкцию ХЛАТ+ таблица с значениями 0/1 (Нет/Да). Программа при запуске выводит приветствие с ФИО исполнителя, НОМЕР ЗАЧЕТНОЙ КНИЖКИ и текст задания. Программа ожидает ввода строки от пользователя, затем выполняет действия в соответствии с заданием - во введенной строке подсчитать количество гласных.. Результат отобразить на экране.
Бьюсь 3й день. В ассемблере не бум-бум. Просмотрев аналогичные темы, что-то смастерила...но проблема с поиском в строке гласных и не знаю, как совместить два кода - само приветствие с указанием группы и ФИО и саму прогу..вот коды:
Приветствие:
.model large .data s1 DB 10,13,10,13,10,13,10,13 DB ' -----------------------------------------------------------» ',10,13 DB ' / Семестровая работа ',10,13 DB ' / Студента группы А-234 Иванов Иван Иванович ',10,13 DB ' / Вариант 4 DB ' ------------------------------------------------------------ ',10,13 DB 10,13,10,13,10,13,10,13 DB ' „«Для продолжения нажмите любую клавишу ! ',10,13,10,13,'$' .stack org 500h .code mov AX, @data mov DS, AX lea DX, s1 mov AH, 9h ** int 21h mov AH, 1h int 21h call PrintNum mov AH, 1h int 21h mov ax, 4c00h int 21h ret PrintNum PROC NEAR mov ax,0B800h mov es,ax mov byte ptr es:[0],'1' mov byte ptr es:[1],0a9h mov bx,162 mov byte ptr es:[bx],'2' mov byte ptr es:[bx+1],0a9h mov si,162 mov byte ptr es:[bx+si],'3' mov byte ptr es:[bx+si+1],0a9h mov byte ptr es:[bx+si+162],'4' mov byte ptr es:[bx+si+162+1],0a9h ret PrintNum ENDP end
программа:
model small .stack 100h .data mes1 db "Vvedite stroky: $" mes3 db 0ah,0dh,"Kol-vo povtoreniy vvedennogo simvola: $" mes4 db 0ah,0dh,"Vvedite proizvonuy simvol dlya sravneniya: $" mes5 db 0ah,0dh,"Simvol nekorrekten: $" string db 100 dup ("$") string1 db 'aeiouy' len_string = $-string adr_string dd string .code main: mov ax,@data mov ds,ax xor ax,ax mov ah,09h lea dx,mes1 lea si,string1 int 21h mov cx,len_string dec cx les di,adr_string m1: mov ah,01h int 21h cmp al,0dh je prov cmp al,0 jne m2 jmp prov m2: stosb loop m1 prov: mov cx,len_string dec cx mov si,0 exit: lea dx,mes4 mov ah,09h ;ah=09h int 21h mov ah,01h ;ah=01h int 21h cmp al,0 je not2 go: cmp string[si],'string1' [I]вот тут не знаю как искать![/I] jne go1 inc bh go1: inc si loop go lea dx,mes3 mov ah,09h int 21h add bh,"0" mov dl,bh mov ah,02h int 21h jmp ex not2: lea dx,mes5 mov ah,09h int 21h ex: mov ax,4c00h mov ah,10h mov ah,0 int 16h mov ah,4Ch int 21h end main
Решение задачи: «Во введенной строке подсчитать количество гласных символов»
textual
Листинг программы
;fasm code.... org 100h jmp start mess0 db 13,10,' СЕМЕСТРОВАЯ РАБОТА' db 13,10,' Иванов Иван Иванович.' db 13,10,' Студент группы А-234. Вариант 4' db 13,10,' ---------------------------------------------' db 13,10,' Введите строку: $' mess1 db 13,10,' Гласные буквы.: $' mess2 db 13,10,' Кол-во гласных: $' buff db 80 dup('$') ; выходной буфер для 0/1 except db 'AEIOUYaeiouy' ; таблица исключений (длина 12-символов) table db '01' ; таблица для XLATB start: mov ah,9 ; мессага mov dx,mess0 ; int 21h ; mov cx,80 ; макс.символов для ввода (= размеру буфера) mov di,buff ; адрес для сохранения нулей/единиц input: mov ah,1 ; ввод с клавиатуры с эхом (отображением) int 21h ; cmp al,13 ; это Enter? je begin ; да - закончить ввод! cmp al,' ' ; это пробел? je space ; да - пропустить преобразования.. call findLetter ; проверка на гласную mov al,bl ; AL - указатель на элемент в таблице XLATB mov bx,table ; BX - адрес этой таблицы xlatb ; подставляем символ из таблицы! space: stosb ; сохраняем это значение в буфере loop input ; читаем сл.пимпу с клавиатуры.. begin: mov ah,9 ; юзер нажал Enter! mov dx,mess1 ; мессага.. int 21h ; mov dx,buff ; выводим следом данные из буфера int 21h ; mov dx,mess2 ; ..и сразу сл.мессагу int 21h ; mov cx,80 ; считаем единицы в буфере! xor bx,bx ; BX = 0 (будет счётчиком найденых) mov di,buff ; где искать mov al,'1' ; что искать count: repne scasb ; ПОИСК!... jcxz stop ; всю строку проверили? inc bx ; нет - счётчик +1 jmp count ; продолжаем поиск.. stop: xchg ax,bx ; СТОП! отправляем счётчик в АХ aam ; переводим его в символы or ax,3030h ; xchg ah,al ; int 29h ; xchg ah,al ; int 29h ; ..и выводим на экран exit: xor ax,ax ; ждём любую клавишу.. int 16h ; int 20h ; выход! ;--------------------------------------------------------------------- findLetter: ; Функция проверяет AL на гласную push cx di ; запомним состояние регистров.. xor bl,bl ; BL = 0 (будет флагом для XLATB) mov cx,12 ; всего гласных в массиве mov di,except ; адрес массива repne scasb ; ПОИСК! jcxz next ; выйти, если не гласная inc bl ; иначе: взводим флаг next: pop di cx ; восстановим регистры ret ; возвращаем управление программе
Объяснение кода листинга программы
Код написан на ассемблере и выполняет следующую задачу: введенную пользователем строку анализирует на наличие гласных символов, их количество выводится на экран. Список элементов кода:
- Организация ввода-вывода:
- Переменная
ah
используется для вывода сообщений (значение 9), и для ввода (значение 1). - Переменная
dx
используется для вывода сообщений. - Переменная
di
используется для хранения адреса для сохранения нулей/единиц. - Переменная
cx
используется для подсчета количества символов введенной строки. - Переменная
bx
используется для хранения адреса таблицы исключений. - Переменная
al
используется для хранения текущего символа. - Переменная
bl
используется как флаг для XLATB. - Переменная
table
содержит таблицу для XLATB. - Переменная
except
содержит таблицу исключений. - Переменная
buff
используется как выходной буфер для 0/1. - Переменная
mess0
содержит сообщение:СЕМЕСТРОВАЯ РАБОТА
. - Переменная
mess1
содержит сообщение:Гласные буквы.:
. - Переменная
mess2
содержит сообщение:Кол-во гласных:
. - Переменная
input
содержит введенную пользователем строку. - Переменная
space
содержит символ пробела. - Переменная
count
содержит количество найденных гласных. - Переменная
stop
содержит количество найденных гласных. - Переменная
next
содержит адрес следующей инструкции в функцииfindLetter
. - Переменная
output
содержит результат подсчета гласных символов. - Переменная
output1
содержит результат подсчета гласных символов. - Переменная
output2
содержит результат подсчета гласных символов.
- Переменная
- Организация управления:
- Команда
jmp
используется для перехода к следующему действию. - Команда
mov
используется для перемещения значений между регистрами и переменными. - Команда
int
используется для обращения к функциям BIOS. - Команда
xlatb
используется для замены символа в соответствии с таблицей XLATB. - Команда
stosb
используется для записи в буфер. - Команда
repne scasb
используется для поиска символа в буфере. - Команда
xchg
используется для обмена значениями между регистрами. - Команда
aam
используется для перевода десятичного числа в ASCII-код. - Команда
or
используется для установки или изменения бита в числе. - Команда
xor
используется для установки значения регистра в ноль. - Команда
push
используется для сохранения состояния регистров. - Команда
pop
используется для восстановления состояния регистров. - Команда
ret
используется для возврата управления программе. - Команда
je
используется для перехода к указанному адресу, если условие истинно. - Команда
jcxz
используется для перехода к указанному адресу, если количество введенных символов равно нулю. - Команда
inc
используется для увеличения значения регистра на единицу. - Команда
loop
используется для повторного выполнения цикла ввода.
- Команда
- Организация данных:
- Переменная
buff
содержит строку, введенную пользователем. - Переменная
table
содержит таблицу для XLATB. - Переменная
except
содержит таблицу исключений. - Переменная
output
содержит результат подсчета гласных символов. - Переменная
output1
содержит результат подсчета гласных символов. - Переменная
output2
содержит результат подсчета гласных символов.
- Переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д