Advertisement
SquirrelInBox

task2_1

Apr 18th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. LOCALS
  2.  
  3. model tiny
  4. .code
  5. org 100h
  6.  
  7. start:
  8.  
  9. jmp main ; перепрыгиваем все процедуры
  10. dw 2144h ; сказали в памяти, что это мы
  11. oldVec2f dd 0
  12.  
  13.  
  14. my_handler proc ; наш обработчик
  15. cmp ax, 82f2h ; если пришло то, что надо
  16. ; с нужным магическим числом и функцией
  17. jne @@end
  18.  
  19. cmp dx, 22ffh
  20. jne @@end
  21.  
  22. mov ax, error_code_ok ; выставляем код, что резидент наш
  23. xchg dh, dl
  24. @@end:
  25. iret
  26. my_handler endp
  27.  
  28.  
  29. get_old_2f proc
  30. push ax
  31. call our35h
  32. push dx
  33. pop es
  34. pop ax
  35. ret
  36. get_old_2f endp
  37.  
  38.  
  39. set_int proc ; ставим свой обработчик my_handler на вектор 2fh
  40. call get_old_2f ; узнали старый вектор 2fh
  41. mov word ptr [oldVec2f], bx
  42. mov word ptr [oldVec2f+2], es ; записали вектор в переменную
  43. mov dx, offset my_handler
  44. call our25h_to_old_handler
  45. ret
  46. set_int endp
  47.  
  48. del_int proc
  49. call our35h
  50. push dx
  51. pop es
  52. cmp word ptr es:[bx-6], 2144h
  53. jne @@end
  54.  
  55. push ds
  56. mov dx, word ptr es:[bx-4]
  57. mov ax, word ptr es:[bx-2]
  58.  
  59. mov ds, ax
  60. ;mov ax, 252fh
  61. ;int 21h
  62. call our25h_to_old_handler
  63. pop ds
  64.  
  65. push es
  66. mov ax, es:[2ch]
  67. mov es, ax
  68. mov ah, 49h
  69. int 21h
  70. pop es
  71.  
  72. mov ah, 49h
  73. int 21h
  74. @@end:
  75. ret
  76. del_int endp
  77.  
  78.  
  79. our35h proc
  80. push ES ; сохранение ES
  81. xor BX,BX ; 0=> BX
  82. mov ES,BX ; 0=> ES, сегмент начала ОП
  83. mov BX,ES:[4*2fh] ; смещение старого обработчика
  84. mov DX,ES:[4*2fh+2]; cегмент старого обработчика
  85. pop ES
  86.  
  87. ret
  88. our35h endp
  89.  
  90. our25h_to_my_handler proc
  91. cli ; нельзя внешние прерывания
  92. push es
  93.  
  94. xor ax,ax
  95. push ax
  96. pop es
  97. mov ax, offset my_handler ; нашли смещение нового обработчика
  98. ; mov bx, offset my_handler + 2 ; нашли сегмент нового обработчика
  99. mov bx, ds
  100. mov es:[4*2fh], ax
  101. mov es:[4:2fh + 2], bx
  102. pop es
  103. sti ; можно внешние прерывания
  104. ret
  105. our25h_to_my_handler endp
  106.  
  107.  
  108. our25h_to_old_handler proc
  109. cli ; нельзя внешние прерывания
  110. push es
  111. xor ax,ax
  112. push ax
  113. pop es
  114. mov es:[4*2fh], dx
  115. mov es:[4:2fh + 2], ds
  116. pop es
  117. sti ; можно внешние прерывания
  118. ret
  119. our25h_to_old_handler endp
  120.  
  121. main: ; здесь все начинается
  122.  
  123. jmp new_start
  124.  
  125. get_nums proc
  126. push -1
  127. mov bx, 10h
  128. @@loop1:
  129. xor dx, dx
  130. div bx
  131. push dx
  132. cmp ax, 0
  133. jne @@loop1
  134.  
  135. xor cx, cx
  136. mov cx, 4
  137. xor dx, dx
  138. @@loop:
  139. pop dx
  140. cmp dx, -1
  141. je @@end
  142.  
  143. cmp dl, 0ah
  144. jge @@more
  145.  
  146. add dl, 30h
  147. jmp @@write
  148. @@more:
  149. add dl, 37h
  150.  
  151. @@write:
  152. mov ah, 02h
  153. int 21h
  154. jmp @@loop
  155. @@end:
  156. ret
  157. get_nums endp
  158.  
  159. next_line proc
  160. mov ah, 09h
  161. lea dx, nl
  162. int 21h
  163. ret
  164. next_line endp
  165.  
  166. colon proc
  167. mov ah, 02h
  168. mov dl, 3ah
  169. int 21h
  170. ret
  171. colon endp
  172.  
  173. write_current_addr proc
  174. mov ax, 352fh
  175. int 21h
  176.  
  177. mov ax, es
  178. ;mov ax, offset my_handler
  179. call get_nums
  180.  
  181. call colon
  182.  
  183. mov ax, bx
  184. ;mov ax, ds
  185. call get_nums
  186. ret
  187. write_current_addr endp
  188.  
  189. finish proc
  190. push ds
  191. mov dx, word ptr[oldVec2f]
  192. mov ds, word ptr [oldVec2f + 2]
  193.  
  194. mov ax, ds
  195. call get_nums
  196.  
  197. call colon
  198.  
  199. mov ax, dx
  200. call get_nums
  201. pop ds
  202.  
  203. call next_line
  204.  
  205. call write_current_addr
  206.  
  207. ret
  208. finish endp
  209.  
  210.  
  211. new_start:
  212.  
  213.  
  214. get_args: ; надо прочитать ключи
  215. xor cx, cx
  216. mov cx, cs:[80h]
  217. sub cx, 2000h
  218. dec cx
  219.  
  220. xor bx, bx
  221. mov si, 82h ; адрес первого символа в аргументе
  222. mov bx, 2fh ; код слеша
  223. cmp [si], bl
  224. jne bad ; первый символ не наш - все плохо
  225. dec cx
  226. jmp ok
  227.  
  228. bad:
  229. jmp afail
  230. ok:
  231. inc si
  232.  
  233. xor bx, bx
  234. mov bx, 31h ; код единицы
  235. cmp[si], bl
  236. je is_end_r2 ; прочитали строку /1 - первый ключ
  237.  
  238. xor bx, bx
  239. mov bx, 64h ; код единицы
  240. cmp[si], bl
  241. je is_end_del
  242.  
  243. jmp afail ; плохой аргумент
  244.  
  245. is_end_r2:
  246. dec cx
  247. cmp cx, 0
  248. je r2
  249. jmp afail
  250.  
  251. is_end_del:
  252. dec cx
  253. cmp cx, 0
  254. je del
  255. jmp afail
  256.  
  257. r2:
  258. mov ah, magic_num
  259. mov al, magic_func
  260. mov dx, magic_num_dx
  261. int 2fh
  262. cmp ax, error_code_ok
  263. jne set
  264.  
  265. cmp dx, 0ff22h
  266. je installed
  267.  
  268. set:
  269. call set_int
  270.  
  271. call finish
  272. mov ah, 31h ; ставим резидента с помощью 31h функции
  273. mov al, 00h ; код возврата
  274. mov bx, offset main
  275. sub bx, offset start
  276. add bx, 0fh
  277. sar bx, 4
  278. add bx, 10h
  279.  
  280. mov dx, bx ;(offset r2 - offset start + 15)/16 + 1 ; сколько параграфов поделить сдвигом вправо
  281. int 21h
  282.  
  283. del:
  284. call del_int
  285. mov ah, 9h
  286. lea dx, msg_del
  287. int 21h
  288. ret
  289.  
  290.  
  291. afail: ; если неправильный аргумент
  292. mov ah, 9h
  293. lea dx, argmess
  294. int 21h
  295. ret
  296.  
  297.  
  298.  
  299. installed: ; если резидент уже загружен
  300. mov ah, 9h
  301. lea dx, msg_n_inst
  302. int 21h
  303. ret
  304.  
  305.  
  306. magic_num db 82h
  307. magic_func db 0f2h
  308. magic_num_dx dw 22ffh
  309. error_code_ok dw 0f2h
  310. argmess db "Error: Incorrect args", 24h
  311. msg_n_inst db "Allready installed", 0dh, 0ah, '$'
  312. msg_inst db "Resident installed", 0dh, 0ah, '$'
  313. msg_del db "Deleted", 0dh, 0ah, '$'
  314. nl db 0dh, 0ah, '$'
  315. end start
  316.  
  317.  
  318. ; почему сначала смещение, а потом сегмент
  319. ; почему везде умножаем на 4, когда делаем сами 25h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement