Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает? - Assembler

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

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

Написал резидентную программу, всё работает, но если моя или другие программы вызывают функцию 4ch прерывания 21h, консоль перестаёт реагировать на нажатия, хотя курсор мигает. Мне нужно вызывать эту функцию для выхода из копии программы при повторном запуске. Также, если после загрузки вызываю программу mem, то консоль перестаёт реагировать на нажатия, хотя курсор мигает. Скорее всего это связано с заменой вектора прерываний, но вот что именно не так, поянять не могу. Буду благодарен за помощь.
Листинг программы
  1. code segment
  2. old_int09 dd 0
  3. old_int2Fh dd 0
  4. message1 db "Programm already runs", 10, '$'
  5. message2 db "Programm unloaded", 10, '$'
  6. assume cs: code
  7. jmp start
  8. new_int2Fh proc far
  9. cmp ax,0FF00h
  10. jz installed
  11. jmp dword ptr cs:old_int2Fh
  12. installed:
  13. mov ax,00FFh
  14. iret
  15. new_int2Fh endp
  16. new_int09h proc
  17. pushf
  18. call old_int09
  19. pushf
  20. push ax
  21. push dx
  22. push bx
  23. push cx
  24. push si
  25. mov ah, 01h
  26. int 16h
  27. cmp al, 24
  28. je write_data
  29. cmp al, 19
  30. je unload
  31. jmp return
  32. write_data:
  33. push 0f000h
  34. pop ds
  35. mov ah, 02h
  36. mov bx, 0e00eh
  37. mov cx, 103
  38. mov si, 0
  39. write_hex:
  40. cmp byte ptr [bx][si], 0
  41. je continue1
  42. mov dl, [bx][si]
  43. call write_byte
  44. continue1:
  45. inc si
  46. loop write_hex
  47. call new_line
  48. call new_line
  49. mov cx, 103
  50. mov si, 0
  51. write:
  52. cmp byte ptr [bx][si], 0
  53. je continue2
  54. mov dl, [bx][si]
  55. int 21h
  56. continue2:
  57. inc si
  58. loop write
  59. call new_line
  60. mov ah, 00h
  61. int 16h
  62. jmp return
  63. unload:
  64. mov ah, 00h
  65. int 16h
  66. mov ax, 2509h
  67. mov dx, word ptr old_int09
  68. mov ds, word ptr old_int09+2
  69. int 21h
  70. mov ax, 252fh
  71. mov dx, word ptr old_int2Fh
  72. mov ds, word ptr old_int2Fh+2
  73. int 21h
  74. mov ah, 09h
  75. push cs
  76. pop ds
  77. mov dx, offset message2
  78. int 21h
  79. mov ax, 04c00h
  80. int 21h
  81. return:
  82. pop si
  83. pop cx
  84. pop bx
  85. pop dx
  86. pop ax
  87. popf
  88. iret
  89. new_int09h endp
  90. start:
  91. main proc far
  92. mov ax, 0FF00h
  93. int 2Fh
  94. cmp ax, 00FFh
  95. jne first_start
  96. mov ah, 09h
  97. push cs
  98. pop ds
  99. mov dx, offset message1
  100. int 21h
  101. mov ax, 4c00h
  102. int 21h
  103. first_start:
  104. push cs
  105. pop ds
  106. mov ax, 3509h
  107. int 21h
  108. mov word ptr old_int09, bx
  109. mov word ptr old_int09+2, es
  110. mov ax, 2509h
  111. mov dx, offset new_int09h
  112. int 21h
  113. mov ax, 352fh
  114. int 21h
  115. mov word ptr old_int2Fh, bx
  116. mov word ptr old_int2Fh+2, es
  117. mov ax, 252fh
  118. mov dx, offset new_int2Fh
  119. int 21h
  120. mov dx, (start - new_int09h +0fh)/16
  121. mov ah, 31h
  122. int 21h
  123. main endp
  124. write_byte proc
  125. push ax
  126. push cx
  127. push dx
  128. mov ah, 02h
  129. mov cx, 2
  130. mov dh, dl
  131. shr dh, 4
  132. and dl, 0fh
  133. xchg dl, dh
  134. push dx
  135. write_sign:
  136. cmp cx, 1
  137. jne second_sign
  138. pop dx
  139. shr dx, 8
  140. second_sign:
  141. cmp dl, 9
  142. jle number
  143. add dl, 7
  144. number:
  145. add dl, '0'
  146. int 21h
  147. loop write_sign
  148. mov dl, ' '
  149. int 21h
  150. pop dx
  151. pop cx
  152. pop ax
  153. ret
  154. write_byte endp
  155. new_line proc
  156. mov ah, 02h
  157. mov dl, 10
  158. int 21h
  159. ret
  160. new_line endp
  161. code ends
  162. end start

Решение задачи: «Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает?»

textual
Листинг программы
  1.     mov dx, word ptr cs:[old_int09]

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


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

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

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

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

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

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