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