Advertisement
qberik

Untitled

Dec 19th, 2022
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. .model small
  2. .stack 100h
  3.  
  4.  
  5. ; макрос для вывода числа
  6. ; можно игнорировать
  7. print_number_word macro number
  8. local _print,_positive
  9. mov ax, number
  10. push bx
  11. push cx
  12. push dx
  13. xor bx, bx
  14. xor cx, cx
  15. xor dx, dx
  16. cmp ax, 0
  17. jns _positive
  18. neg ax
  19. mov bx, ax
  20. mov ah, 02h
  21. mov dl, '-'
  22. int 21h
  23. mov ax, bx
  24. _positive:
  25. mov dx, 0
  26. mov bx, 10
  27. div bx
  28. push dx
  29. inc cx
  30. cmp ax, 0
  31. jne _positive
  32. _print:
  33. pop dx
  34. add dx, '0'
  35. mov ax, 0200h
  36. int 21h
  37. loop _print
  38. pop dx
  39. pop cx
  40. pop bx
  41. endm print_number_word
  42.  
  43.  
  44.  
  45. .data
  46.  
  47. old_int_offset dw ?
  48. old_int_seg dw ?
  49.  
  50. text db "Number of call ",'$'
  51. endl db 13,10,'$'
  52. count dw 0
  53.  
  54.  
  55. .code
  56. cool_interrup proc far
  57. ; можно и pusha
  58. push ax
  59. push bx
  60. push cx
  61. push dx
  62. push si
  63. push di
  64. push bp
  65. pushf
  66.  
  67. ; увеличиваем счётчик
  68. mov ax, count
  69. inc ax
  70. mov count, ax
  71.  
  72. ; выывод строки
  73. mov ah, 09h
  74. mov dx, offset text
  75. int 21h
  76. print_number_word count
  77. mov ah, 09h
  78. mov dx, offset endl
  79. int 21h
  80.  
  81. ; можно и popa
  82. popf
  83. pop bp
  84. pop di
  85. pop si
  86. pop dx
  87. pop cx
  88. pop bx
  89. pop ax
  90. iret
  91. cool_interrup endp
  92.  
  93. start:
  94. mov ax, @data
  95. mov ds, ax
  96.  
  97.  
  98. ; получим адреса прерываний, которые были ещё до нас
  99. mov ah, 35h ; получить вектор прерывания
  100. mov al, 1Ch ; прерывание таймера
  101. int 21h
  102. ; в bx записался сдвиг старого прерывания
  103. ; в ex записался сегмерт старого прерывания
  104.  
  105. ; их надо запомнить, чтобы потом вернуть всё на место
  106. mov old_int_offset, bx
  107. mov old_int_seg , es
  108.  
  109. ; теперь можем написать что-то своё заместо прошлого прерывания
  110.  
  111.  
  112.  
  113. ; пусть эта функция будет нашим прерыванием
  114.  
  115. push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
  116.  
  117. mov dx, offset cool_interrup
  118. mov ax, seg cool_interrup
  119. mov ds, ax ; можно поменять только через ax
  120.  
  121. mov ah, 25h ; поменятьменять вектор прерывания
  122. mov al, 1Ch ; наше прерывание таймера
  123. int 21h
  124.  
  125. pop ds
  126.  
  127.  
  128. _loop:
  129. nop
  130.  
  131. mov ax, count
  132. cmp ax, 100
  133. je _end
  134. jmp _loop
  135.  
  136. _end:
  137.  
  138.  
  139. ; надо вернуть всё как было
  140. mov dx, old_int_offset
  141. mov ax, old_int_seg
  142. mov ds, ax ; можно поменять только через ax
  143.  
  144. mov ah, 25h ; поменятьменять вектор прерывания
  145. mov al, 1Ch ; наше прерывание таймера
  146. int 21h
  147.  
  148.  
  149. mov ax, 4c00h
  150. int 21h
  151.  
  152.  
  153. end start
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement