Advertisement
Alexander26974

Untitled

Dec 18th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. Data segment
  2. time dw 18 ;переменная таймера
  3. txt db " ", 13,10,"$" ;вывод
  4.  
  5. mas db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  6.  
  7. pos dw offset mas
  8.  
  9. cnt dw 10 ;для счетчика смещения
  10. trii dw 0
  11. SAVE_CS DW 0 ;сохраняем сегмент заменяемого прерывания
  12. SAVE_IP DW 0 ;сохраняем смещение прерывания
  13. Data ends
  14.  
  15. code segment
  16. start: assume cs:code, ds: data, es:stk
  17. mov AX, data
  18. mov DS, AX ;сохраняем исходное прерывание
  19. mov AH, 25h ;функция получения вектора
  20. mov AL, 8h ;номер вектора
  21. int 21h
  22. mov SAVE_IP, BX ;запоминаем смещение в BX
  23. mov SAVE_CS, ES ;запоминаем сегмент в ES
  24.  
  25. push DS
  26. mov DX,offset myint ;смещение для процедуры в DX
  27. mov AX, seg myint ;помещаем сегмент процедуры в DS
  28. mov DS, AX
  29. mov AH, 25h ;в AH-> функцию установки вектора
  30. mov AL, 8h ;в AL-> номер вектора
  31. int 21h ;поменяли прерывание
  32. pop DS
  33. B:
  34. jmp B
  35.  
  36. myint proc far
  37. push AX ;сохраняем все измененные регистры
  38. push DX
  39. dec time
  40. cmp time, 0
  41. jnz nxt
  42. @@label:
  43. dec cnt
  44. mov AX, 18
  45. mov time, AX
  46.  
  47. mov AX, trii
  48. inc BX
  49. mov bx,[pos]
  50. cmp bx,offset pos
  51. jae @@end
  52. inc [pos]
  53. mov al,[bx]
  54. or al,al
  55. jnp @@label
  56. xor ah,ah
  57. call PrintNumber
  58. mov ah,2
  59. mov dl,' '
  60. int 21h
  61. @@end:
  62. nxt:
  63. pop DX ;чтение из стека
  64. pop AX ;восстановили регистры
  65. mov AL, 20h ;аппартаное прерывание
  66. out 20h, AL ;
  67. iret
  68. myint endp
  69.  
  70. PrintNumber proc ;процедура показа числа из AX
  71. push BX ;сохраняем содержимое регистров в стек, чтобы потом вернуть их
  72. push DX
  73. push SI
  74. push CX
  75. mov CX, 0 ;инициализируем цикл
  76. mov BX, 10 ;в BX заносим основание системы счисления
  77. loophere: ;основной цикл
  78. mov DX, 0 ;обнуляем DX
  79. div BX ;делим на 10
  80.  
  81. push AX ;результат в стеке
  82. add DL, "0" ;конвертируем последнюю цифру в ASCII-код
  83.  
  84. pop AX ;вернем AX
  85. push DX ;сохраним DX
  86. inc CX ;увеличим CX на 1
  87. cmp AX, 0 ;повторяем для всех цифр числа
  88. jnz loophere
  89. mov AH, 2 ;DOS-функция вывода символа
  90. loophere2:
  91. pop DX ;восстанавливливаем цифры от последней к первой и
  92. mov AH, 02h ;выводим их на экран
  93. int 21h
  94. loop loophere2
  95.  
  96. pop CX
  97. pop SI
  98. pop DX
  99. pop BX
  100. ret
  101. PrintNumber endp
  102.  
  103. codeend: ;восстанавливаем исходный вектор
  104. CLI
  105. push DS
  106. mov DX, SAVE_IP
  107. mov AX, SAVE_CS
  108. mov DS, AX
  109. mov AH, 25h
  110. mov AL, 1ch
  111. int 21h
  112. pop DS
  113. STI
  114.  
  115. mov AX, 4ch
  116. int 21h
  117. code ends
  118.  
  119. stk segment stack
  120. db 256 dup ("*")
  121. stk ends
  122.  
  123. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement