Запис нагромаджувача від використання несанкціонованих дискет з використанням інженерних циліндрів диску, страница 2

           jnz error

           inc di

           inc si

           loop loopm

           POP    sp ss es ds di si dx cx bx ax

m4:

           pushf

           call old_9h

           POP    es ds di si dx cx bx ax

           iret

error:     pop  sp ss es ds di si dx cx bx ax

           mov dl,01

           jmp m4

border     endp             ; Конец резидентной части

 ;----------------------------------------

; Часть данной программы, удаляемая из памяти

  init:

; Проверяем, присутствует ли уже в памяти

; наша резидентная программа

           push   es

           mov    ah,35h

           mov    al,13h

           int    21h       ; (es:bx) - адрес точки входа

                            ;           в программу обработки

                            ;           прерывания 13h

; Если в памяти уже размещена наша программа обработки

; прерывания 13h, то адрес байта  es:(bx-1)  есть адрес

; байта-индикатора  res_is

           mov    al,byte ptr es:[bx-1]

           cmp    byte ptr es:res_is,al

           jz     already

           pop    es

 ;========================================

; Реализуем резидентное размещение.

 ;========================================

; Формируем и запоминаем адрес точки входа в нашу резидентную

; программу

           lea    dx,border

           mov    word ptr adr_res,dx

           mov    word ptr adr_res+2,cs

 ;----------------------------------------

; Перепрограммируем вектор 13h

 ;----------------------------------------

           assume ds:int_tab

           push   ds

           mov    ax,int_tab

           mov    ds,ax

           cli

; В качестве "старого" запоминаем текущее значение вектора 13h

           mov    ax,word ptr vect_9h

           mov    word ptr old_9h,ax

           mov    ax,word ptr vect_9h+2

           mov    word ptr old_9h+2,AX

; В качестве текущего значения вектора 9h запоминаем адрес

; точки входа в нашу резидентную программу

           mov    word ptr vect_9h,offset border

           mov    word ptr vect_9h+2,cs

           sti

           pop    ds

           mov    ah,09h

           lea    dx,text_1

           int    21h

           mov    ah,08h

           int    21h

           mov    dx,offset init

           inc    dx      ; (dx) - расстояние в байтах от

                          ;        PSP данной программы до

                          ;        конца резидентно размещае-

                          ;        мой ее части

                          ; (cs) - сегментная часть адреса PSP

           int    27h     ; Резидентное размещение программы

 ;========================================

  already:

           pop    es

 ;----------------------------------------

; Резидентная часть данной программы уже размещена в памяти.

; Если считаем, что ее целесообразно удалить, то при

; повторном вызове данной программы должны указать

; параметр  /d  в командной строке.

           xor    ax,ax            ; Анализируем содержимое

           mov    al,es:80h        ; командной строки