Во введенной строке подсчитать количество гласных символов - 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
содержит результат подсчета гласных символов.
- Переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д