Во введенной строке подсчитать количество гласных символов - Assembler

Узнай цену своей работы

Формулировка задачи:

Делаю семестровку. Задание такое: разработать программу на языке Ассемблера Интелx86 для ДОС. Модель памяти – не регламентируется. Все числа – однозначные (от 0 до 9). Для проверки на гласные, согласные, простые числа и т.д. использовать конструкцию ХЛАТ+ таблица с значениями 0/1 (Нет/Да). Программа при запуске выводит приветствие с ФИО исполнителя, НОМЕР ЗАЧЕТНОЙ КНИЖКИ и текст задания. Программа ожидает ввода строки от пользователя, затем выполняет действия в соответствии с заданием - во введенной строке подсчитать количество гласных.. Результат отобразить на экране. Бьюсь 3й день. В ассемблере не бум-бум. Просмотрев аналогичные темы, что-то смастерила...но проблема с поиском в строке гласных и не знаю, как совместить два кода - само приветствие с указанием группы и ФИО и саму прогу..вот коды:

Приветствие:

Листинг программы
  1. .model large
  2. .data
  3. s1 DB 10,13,10,13,10,13,10,13
  4. DB ' -----------------------------------------------------------» ',10,13
  5. DB ' / Семестровая работа ',10,13
  6. DB ' / Студента группы А-234 Иванов Иван Иванович ',10,13
  7. DB ' / Вариант 4
  8. DB ' ------------------------------------------------------------ ',10,13
  9. DB 10,13,10,13,10,13,10,13
  10. DB ' „«Для продолжения нажмите любую клавишу ! ',10,13,10,13,'$'
  11. .stack
  12. org 500h
  13. .code
  14. mov AX, @data
  15. mov DS, AX
  16. lea DX, s1
  17. mov AH, 9h **
  18. int 21h
  19. mov AH, 1h
  20. int 21h
  21. call PrintNum
  22. mov AH, 1h
  23. int 21h
  24. mov ax, 4c00h
  25. int 21h
  26. ret
  27. PrintNum PROC NEAR
  28. mov ax,0B800h
  29. mov es,ax
  30. mov byte ptr es:[0],'1'
  31. mov byte ptr es:[1],0a9h
  32. mov bx,162
  33. mov byte ptr es:[bx],'2'
  34. mov byte ptr es:[bx+1],0a9h
  35. mov si,162
  36.  
  37. mov byte ptr es:[bx+si],'3'
  38. mov byte ptr es:[bx+si+1],0a9h
  39. mov byte ptr es:[bx+si+162],'4'
  40. mov byte ptr es:[bx+si+162+1],0a9h
  41. ret
  42. PrintNum ENDP
  43.  
  44. end

программа:

Листинг программы
  1. model small
  2. .stack 100h
  3. .data
  4. mes1 db "Vvedite stroky: $"
  5. mes3 db 0ah,0dh,"Kol-vo povtoreniy vvedennogo simvola: $"
  6. mes4 db 0ah,0dh,"Vvedite proizvonuy simvol dlya sravneniya: $"
  7. mes5 db 0ah,0dh,"Simvol nekorrekten: $"
  8. string db 100 dup ("$")
  9. string1 db 'aeiouy'
  10. len_string = $-string
  11. adr_string dd string
  12. .code
  13. main:
  14. mov ax,@data
  15. mov ds,ax
  16. xor ax,ax
  17. mov ah,09h
  18. lea dx,mes1
  19. lea si,string1
  20. int 21h
  21. mov cx,len_string
  22. dec cx
  23. les di,adr_string
  24. m1:
  25. mov ah,01h
  26. int 21h
  27. cmp al,0dh
  28. je prov
  29. cmp al,0
  30. jne m2
  31. jmp prov
  32. m2:
  33. stosb
  34. loop m1
  35. prov:
  36. mov cx,len_string
  37. dec cx
  38. mov si,0
  39. exit:
  40. lea dx,mes4
  41. mov ah,09h ;ah=09h
  42. int 21h
  43. mov ah,01h ;ah=01h
  44. int 21h
  45. cmp al,0
  46. je not2
  47. go:
  48. cmp string[si],'string1' [I]вот тут не знаю как искать![/I]
  49. jne go1
  50. inc bh
  51. go1:
  52. inc si
  53. loop go
  54. lea dx,mes3
  55. mov ah,09h
  56. int 21h
  57. add bh,"0"
  58. mov dl,bh
  59. mov ah,02h
  60. int 21h
  61. jmp ex
  62. not2:
  63. lea dx,mes5
  64. mov ah,09h
  65. int 21h
  66. ex:
  67. mov ax,4c00h
  68. mov ah,10h
  69. mov ah,0
  70. int 16h
  71. mov ah,4Ch
  72. int 21h
  73. end main

Решение задачи: «Во введенной строке подсчитать количество гласных символов»

textual
Листинг программы
  1. ;fasm code....
  2. org  100h
  3. jmp  start
  4.  
  5. mess0   db   13,10,' СЕМЕСТРОВАЯ РАБОТА'
  6.         db   13,10,' Иванов Иван Иванович.'
  7.         db   13,10,' Студент группы А-234. Вариант 4'
  8.         db   13,10,' ---------------------------------------------'
  9.         db   13,10,' Введите строку: $'
  10. mess1   db   13,10,' Гласные буквы.: $'
  11. mess2   db   13,10,' Кол-во гласных: $'
  12.  
  13. buff    db   80 dup('$')       ; выходной буфер для 0/1
  14. except  db   'AEIOUYaeiouy'    ; таблица исключений (длина 12-символов)
  15. table   db   '01'              ; таблица для XLATB
  16.  
  17. start:  mov   ah,9           ; мессага
  18.         mov   dx,mess0       ;
  19.         int   21h            ;
  20.  
  21.         mov   cx,80          ; макс.символов для ввода (= размеру буфера)
  22.         mov   di,buff        ; адрес для сохранения нулей/единиц
  23. input:  mov   ah,1           ; ввод с клавиатуры с эхом (отображением)
  24.         int   21h            ;
  25.         cmp   al,13          ; это Enter?
  26.         je    begin          ; да - закончить ввод!
  27.         cmp   al,' '         ; это пробел?
  28.         je    space          ; да - пропустить преобразования..
  29.         call  findLetter     ; проверка на гласную
  30.         mov   al,bl          ; AL - указатель на элемент в таблице XLATB
  31.         mov   bx,table       ; BX - адрес этой таблицы
  32.         xlatb                ; подставляем символ из таблицы!
  33. space:  stosb                ; сохраняем это значение в буфере
  34.         loop  input          ; читаем сл.пимпу с клавиатуры..
  35.  
  36. begin:  mov   ah,9           ; юзер нажал Enter!
  37.         mov   dx,mess1       ; мессага..
  38.         int   21h            ;
  39.         mov   dx,buff        ; выводим следом данные из буфера
  40.         int   21h            ;
  41.         mov   dx,mess2       ; ..и сразу сл.мессагу
  42.         int   21h            ;
  43.  
  44.         mov   cx,80          ; считаем единицы в буфере!
  45.         xor   bx,bx          ; BX = 0 (будет счётчиком найденых)
  46.         mov   di,buff        ; где искать
  47.         mov   al,'1'         ; что искать
  48. count:  repne scasb          ; ПОИСК!...
  49.         jcxz  stop           ; всю строку проверили?
  50.         inc   bx             ; нет - счётчик +1
  51.         jmp   count          ; продолжаем поиск..
  52.  
  53. stop:   xchg  ax,bx          ; СТОП! отправляем счётчик в АХ
  54.         aam                  ; переводим его в символы
  55.         or    ax,3030h       ;
  56.         xchg  ah,al          ;
  57.         int   29h            ;
  58.         xchg  ah,al          ;
  59.         int   29h            ; ..и выводим на экран
  60.  
  61. exit:   xor   ax,ax          ; ждём любую клавишу..
  62.         int   16h            ;
  63.         int   20h            ; выход!
  64. ;---------------------------------------------------------------------
  65. findLetter:                  ; Функция проверяет AL на гласную
  66.         push  cx di          ; запомним состояние регистров..
  67.         xor   bl,bl          ; BL = 0 (будет флагом для XLATB)
  68.         mov   cx,12          ; всего гласных в массиве
  69.         mov   di,except      ; адрес массива
  70.         repne scasb          ; ПОИСК!
  71.         jcxz  next           ; выйти, если не гласная
  72.         inc   bl             ; иначе: взводим флаг
  73. next:   pop   di cx          ; восстановим регистры
  74.         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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы