Задание на обработчик прерываний - Assembler

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

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

Задание: Дан массив A из 10 однобайтовых чисел. Перехватив прерывание от таймера, вывести на экран со сдвигом на один разряд влево только числа, содержащие четное количество единиц. В качестве образца дали пример обработчика, который выводит секунды на экран. Объясните пожалуйста что и как делать.
Листинг программы
  1. Data segment
  2. time dw 18 ;переменная таймера 18,2 сигнала в секунду (5 секунд - это 91 прерывания)
  3. txt db " ", 13,10,"$"
  4. cnt dw 10 ;для счетчика смещения
  5. trii dw 0
  6. SAVE_CS DW 0 ;сохраняем сегмент заменяемого прерывания
  7. SAVE_IP DW 0 ;сохраняем смещение прерывания
  8. Data ends
  9. code segment
  10. start: assume cs:code, ds: data, es:stk
  11. mov AX, data
  12. mov DS, AX ;сохраняем вектор - сохраняем исходные прерывания
  13. mov AH, 25h ;функция получения вектора
  14. mov AL, 8h ;номер вектора
  15. int 21h ;
  16. mov SAVE_IP, BX ;запоминаем смещение в BX
  17. mov SAVE_CS, ES ;запоминаем сегмент в ES
  18. push DS
  19. mov DX,offset rout ;смещение для процедуры в DX
  20. mov AX, seg rout ;помещаем сегмент процедуры в DS
  21. mov DS, AX
  22. mov AH, 25h AH-> функцию установки вектора
  23. mov AL, 8h AL-> номер вектора
  24. int 21h ;т.е. поменяли прерывание
  25. pop DS
  26. B:
  27. jmp B
  28. rout proc far
  29. push AX ;сохраняем все измененные регистры
  30. push DX
  31. dec time
  32. cmp time, 0
  33. jnz nxt
  34. dec cnt
  35. mov AX, 18
  36. mov time, AX
  37. mov AX, trii
  38. inc BX ;
  39. mov CX, 1
  40. add AX, CX
  41. jc codeend
  42. mov trii, AX
  43. call PrintNumber ;вызов процедуры вывода на экран числа из AX
  44. mov AH, 9h
  45. lea DX, txt
  46. int 21h
  47. nxt:
  48. pop DX
  49. pop AX ;восстановили регистры
  50. mov AL, 20h ;аппаратное прерывание
  51. out 20h, AL ;
  52. iret
  53. rout endp
  54. PrintNumber proc ;процедура показа числа из AX
  55. push BX ;сохраняем содержимое регистров в стек, чтобы потом вернуть их
  56. push DX
  57. push SI
  58. push CX
  59. mov CX, 0 ;инициализируем цикл
  60. mov BX, 10 BX заносим основание системы счисления
  61. loophere: ;основной цикл
  62. mov DX, 0 ;обнуляем DX
  63. div BX ;делим на 10
  64. push AX ;результат в стеке
  65. add DL, "0" ;конвертируем последнюю цифру в ASCII-код
  66. pop AX ;вернем AX
  67. push DX ;сохраним DX
  68. inc CX ;увеличим CX на 1
  69. cmp AX, 0 ;повторяем для всех цифр числа
  70. jnz loophere
  71. mov AH, 2 ;DOS-функция вывода символа
  72. loophere2:
  73. pop DX ;восстанавливаем цифры от последней к первой и
  74. mov AH, 02h ;выводим их на экран
  75. int 21h
  76. loop loophere2
  77. pop CX
  78. pop SI
  79. pop DX
  80. pop BX
  81. ret
  82. PrintNumber endp
  83. codeend: ;восстанавливаем исходный вектор
  84. CLI
  85. push DS
  86. mov DX, SAVE_IP
  87. mov AX, SAVE_CS
  88. mov DS, AX
  89. mov AH, 25h
  90. mov AL, 1ch
  91. int 21h
  92. pop DS
  93. STI
  94. mov AX, 4ch
  95. int 21h
  96. code ends
  97. stk segment stack
  98. db 256 dup ("*")
  99. stk ends
  100. end start

Решение задачи: «Задание на обработчик прерываний»

textual
Листинг программы
  1. xor ah,ah
  2. int 16h  ; ждём нажатия клавиши
  3.  
  4. mov ax,2508h
  5. mov ds,SAVE_CS
  6. mov dx,SAVE_IP
  7. int 21h  ; восстанавливаем вектор прерывания таймера
  8.  
  9. mov ax,4C00h
  10. int 21h

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

  1. xor ah,ah - инициализация регистра AH для последующего использования в качестве регистра-приемника
  2. int 16h - ожидание нажатия клавиши. Процессор переходит в режим 16 бит, затем выполняет команду INT 16h, которая вызывает BIOS-функцию обработки прерываний. В данном случае ожидается нажатие клавиши
  3. mov ax,2508h - сохранение текущего состояния регистра AX в переменную AX
  4. mov ds,SAVE_CS - сохранение текущего состояния регистра DS в переменную SAVE_CS
  5. mov dx,SAVE_IP - сохранение текущего состояния регистра DX в переменную SAVE_IP
  6. int 21h - восстановление вектора прерывания таймера. Процессор переходит в режим 16 бит, затем выполняет команду INT 21h, которая вызывает BIOS-функцию обработки прерываний. В данном случае восстанавливается вектор прерывания таймера
  7. mov ax,4C00h - загрузка кода завершения работы программы в регистр AX
  8. int 21h - завершение работы программы. Процессор переходит в режим 16 бит, затем выполняет команду INT 21h, которая вызывает BIOS-функцию обработки прерываний. В данном случае выполняется код завершения работы программы

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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