qberik

Untitled

Dec 19th, 2022
219
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