Assembler - язык неограниченных возможностей


Пассивная резидентная программа - часть 4


tsr_length equ $-int21h_handler

initialize proc near cmp byte ptr cmd_len,3 ; проверить размер ; командной строки jne not_install ; (должно быть 3 - ; пробел, диск, двоеточие) cmp byte ptr cmd_line[2],':' ; проверить ; третий символ командной jne not_install ; строки (должно быть двоеточие) mov al,byte ptr cmd_line[1] and al,11011111b ; преобразовать второй ; символ к заглавной букве cmp al,'A' ; проверить, что это не меньше "А" jb not_install ; и не больше cmp al,'Z' ; "Z", ja not_install ; если хоть одно из ; этих условий ; не выполняется - выдать информацию о программе и выйти, ; иначе - начать процедуру инициализации mov byte ptr drive_letter,al ; вписать имя ; диска в код резидента push es mov ax,3521h ; АН = 35h, ; AL = номер прерывания int 21h ; получить адрес обработчика INT 21h mov word ptr old_int21h,bx ; и вписать его ; в код резидента mov word ptr old_int21h+2,es pop es

cld ; перенос кода резидента, mov si,offset int21h_handler ; начиная ; с этого адреса, mov di,80h ; в PSP:0080h rep movsb mov ax,2521h ; AH = 25h, ; AL = номер прерывания mov dx,0080h ; DS:DX - адрес нашего обработчика int 21h ; установить обработчик INT 21h mov ah,49h ; AH = 49h mov es,word ptr envseg ; ES = сегментный адрес блока ; с нашей копией окружения DOS int 21h ; освободить память из-под ; окружения mov dx,80h+tsr_length ; DX - адрес первого ; байта за концом резидентной части ; программы int 27h ; завершить выполнение, ; оставшись резидентом not_install: mov ah,9 ; АН = 09h mov dx,offset usage ; DS:DX = адрес строки ; с информацией об ; использовании программы int 21h ; вывод строки на экран ret ; нормальное завершение ; программы

; текст, который выдает программа при запуске ; с неправильной командной строкой: usage db "Usage: tsr.com D:",0Dh,0Ah db "Denies delete on drive D:",0Dh,0Ah db "$" initialize endp end start

Теперь эта резидентная программа занимает в памяти только 208 байт.





Начало  Назад  Вперед