ХАНДЫФАР

Программа, которая считет количество всех гласных букв в строке.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Intel 8086. Microsoft "
  6. ___________db "Macro Assembler"
  7. ____vowels db "aeiouAEIOU"
  8. ____output db "Number of vowels: $"
  9. ____result dw 0
  10. data ends
  11. code segment public
  12. ____assume ds:data, cs:code
  13. ____main proc
  14. ________mov ____ax, seg data
  15. ________mov ____ds, ax
  16. ________mov ____es, ax
  17. ________lea ____di, es:[vowels]
  18. ________lea ____si, ds:[string]
  19. ________mov ____cx, 37
  20. ____OuterLoop:
  21. ________push ___cx
  22. ________mov ____cx, 10
  23. ________lodsb
  24. ________push ___di
  25. __repnz scasb
  26. ________jne ____Skip
  27. ________inc ____result
  28. ____Skip:
  29. ________pop ____cx
  30. ________pop ____cx
  31. ________loop ___OuterLoop
  32. ________mov ____ah, 09h
  33. ________lea ____dx, ds:[output]
  34. ________int ____21h
  35. ________mov ____dx, result
  36. ________call ___PrintNumber
  37. ________mov ____ax, 4C00h
  38. ________int ____21h
  39. ____main endp
  40. ____PrintNumber proc
  41. ________mov ____ax, dx
  42. ________mov ____bx, 10
  43. ________cwd
  44. ________div ____bx
  45. ________mov ____cl, 8
  46. ________shl ____ax, cl
  47. ________xchg ___al, dl
  48. ________or _____ax, 3030h
  49. ________xchg ___ax, bx
  50. ________mov ____ah, 02h
  51. ________cmp ____bh, 30h
  52. ________je _____PrintOneDigit
  53. ________mov ____dl, bh
  54. ________int ____21h
  55. ____PrintOneDigit:
  56. ________mov ____dl, bl
  57. ________int ____21h
  58. ________ret
  59. ____PrintNumber endp
  60. code ends
  61. end main
Программа, которая считет количество всех гласных букв в строке.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Intel 8086. Microsoft Macro Assembler"
  6. ____vowels db "aeiouAEIOU"
  7. ____output db "Number of vowels: $"
  8. ____result dw 0
  9. data ends
  10. code segment public _____________; Начало сегмента кода
  11. ____assume ds:data, cs:code
  12. ____main proc ___________________; Начало процедуры main
  13. ________mov ____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  14. ________mov ____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  15. ________mov ____es, ax___________; Передаём адрес сегмента памяти данных из регистра ax в es
  16. ________lea ____di, es:[vowels]__; Загружаем адрес массива vowels в регистр es:di
  17. ________lea ____si, ds:[string]__; Загружаем адрес массива string в регистр ds:si
  18. ________mov ____cx, 37___________; Копируем значение 37 в регистр cx (длина строки string)
  19. ____OuterLoop:
  20. ________push ___cx_______________; Сохраняем значение регистра cx в стеке
  21. ________mov ____cx, 10___________; Копируем значение 10 в регистр cx (количество гласных)
  22. ________lodsb____________________; Загружаем байт из регистра-источника si в регистр al
  23. ________push ___di_______________; Сохраняем значение регистра di в стеке
  24. __repnz scasb____________________; Сканируем байт в регистре al с байтами в регистре di пока CX≠0
  25. ________jne ____Skip_____________; Если ZF=0, то прыгаем на метку Skip
  26. ________inc ____result___________; Увеличиваем значение переменной result
  27. ____Skip:
  28. ________pop ____cx_______________; Выталкиваем значение из стека в регистр di
  29. ________pop ____cx_______________; Выталкиваем значение из стека в регистр cx
  30. ________loop ___OuterLoop________; Выполняем цикл пока CX≠0
  31. ________mov ____ah, 09h__________; Копируем значение функции вывода строки в регистр ah
  32. ________lea ____dx, ds:[output]__; Загружаем адрес переменной output в регистр ds:dx
  33. ________int ____21h______________; Вызываем прерывание DOS
  34. ________mov ____dx, result_______; Копируем значение переменной result в регистр dx
  35. ________call ___PrintNumber______; Вызываем процедуру PrintNumber
  36. ________mov ____ax, 4C00h________; Копируем значение функции завершения в ah а значение в al
  37. ________int ____21h______________; Вызываем прерывание DOS
  38. ____main endp ___________________; Конец процедуры main
  39. ____PrintNumber proc
  40. ________mov ____ax, dx___________; Копируем значение регистра dx в регистр ax
  41. ________mov ____bx, 10___________; Копируем число 10 в регистр bx
  42. ________cwd______________________; Выполняем знаковое расширение регистра dx
  43. ________div ____bx_______________; Выполняем деление значения в регистре ax на bx (10)
  44. ________mov ____cl, 8____________; Копируем число 8 в регистр cl
  45. ________shl ____ax, cl___________; Выполняем логический сдвиг влево на количество в регистре cl
  46. ________xchg ___al, dl___________; Выполняем обмен содержимого регистров al и dl
  47. ________or _____ax, 3030h________; Выполняем логическое ИЛИ над ax с 3030
  48. ________xchg ___ax, bx___________; Выполняем обмен содержимого регистров ax и bx
  49. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  50. ________cmp ____bh, 30h__________; Сравниваем значение в регистре ch c 30h
  51. ________je _____PrintOneDigit____; Если ZF=1, то прыгаем на метку PrintOneDigit
  52. ________mov ____dl, bh___________; Копируем значение регистра ch в регистр dl
  53. ________int ____21h______________; Вызываем прерывание DOS
  54. ____PrintOneDigit:
  55. ________mov ____dl, bl___________; Копируем значение регистра cl в регистр dl
  56. ________int ____21h______________; Вызываем прерывание DOS
  57. ________ret______________________; Возврат из процедуры
  58. ____PrintNumber endp
  59. code ends _______________________; Конец сегмента кода
  60. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda