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

Объяснение кода листинга программы

Код написан на ассемблере и выполняет следующую задачу: введенную пользователем строку анализирует на наличие гласных символов, их количество выводится на экран. Список элементов кода:

  1. Организация ввода-вывода:
    • Переменная 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 содержит результат подсчета гласных символов.
  2. Организация управления:
    • Команда jmp используется для перехода к следующему действию.
    • Команда mov используется для перемещения значений между регистрами и переменными.
    • Команда int используется для обращения к функциям BIOS.
    • Команда xlatb используется для замены символа в соответствии с таблицей XLATB.
    • Команда stosb используется для записи в буфер.
    • Команда repne scasb используется для поиска символа в буфере.
    • Команда xchg используется для обмена значениями между регистрами.
    • Команда aam используется для перевода десятичного числа в ASCII-код.
    • Команда or используется для установки или изменения бита в числе.
    • Команда xor используется для установки значения регистра в ноль.
    • Команда push используется для сохранения состояния регистров.
    • Команда pop используется для восстановления состояния регистров.
    • Команда ret используется для возврата управления программе.
    • Команда je используется для перехода к указанному адресу, если условие истинно.
    • Команда jcxz используется для перехода к указанному адресу, если количество введенных символов равно нулю.
    • Команда inc используется для увеличения значения регистра на единицу.
    • Команда loop используется для повторного выполнения цикла ввода.
  3. Организация данных:
    • Переменная buff содержит строку, введенную пользователем.
    • Переменная table содержит таблицу для XLATB.
    • Переменная except содержит таблицу исключений.
    • Переменная output содержит результат подсчета гласных символов.
    • Переменная output1 содержит результат подсчета гласных символов.
    • Переменная output2 содержит результат подсчета гласных символов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы