int 21h
;Зсунемо вказівник на старий кінець файла, тобто на ключ
mov АН,42h
mov AL,2
mov BX,handle
mov CX,-1
mov DX,-2
int 21h
;Прочитаємо ключ
mov AH,3Fh
mov BX,handle
mov CX,2
mov DX,of set key_rd
int 21h
;Порівняємо прочитаний ключ із записаним у програмі
mov AX,key
сmр AX,key_rd
je ok ;Ключі збігаються
;Ключі не збігаються, виведемо повідомлення mes1 про те,
;що програма не встановлена
jmp ahead ;Продовжимо програму
ok:
;Виведемо повідомлення ims про нормальну роботу
;Зрушимо вказівник на старий кінець файла
ahead:
mov AH,42h
mov AL,2
mov BX,handle
mov CX,-l
mov DX,-Z
Int 21h
;Виконаємо фіктивний запис 0 байтів, щоб зафіксувати поточну довжину файла
mov AH,0h
mov BX,handle
mov CX,0
mov DX,offset key_rd ;Фіктивнийпараметр
Int 21h
;Виведемоповідомлення mes2 провідмовувідкритиФайл
notopen:
jmp outprog
myproc endp
;Поляданих
fname db 'work3.exe',0 ;Ім'яфайла
handle dw 0 ;Коміркадлядескриптора
key dw 1234h ;Ключ, щозаписуєтьсяуфайл
key_rd dw 0 ;Ключ, щочитаєтьсязфайла
mes db 'Программа встановлена і буде працювати нормально',10,13
mes1 db 'Программа не встановлена і не може бути запущена',10,13
mes2 db 'Файл WORK3. EXE не відкрився'. 10.13
mes3 db 'Файл WORK3. EXE не знайдений у таблиці файлів'
Програма INSTALL3. EXE
;Установча програма, призначена для установки
;на жорсткому диску робочої програми WORK3.EXE ;Основні фрагменти програми
;Відчинимо файл із робочою програмою, щоб він потрапив у таблицю файлів
jnc go1
jmp notopen
go1:
mov handle,AX ;
;Одержимоіндекс SFT із JFT, щознаходитьсяв PSP
mov DI,l8h ;ES:DI->JFT
add DI,AX ;ЕS:DI->наш елемент у JFT
mov CL,ES:[DI] ;CL=індекс SFT
xor CH.CH ;CH=індекс SFT
;Одержимо доступ до системної таблиці файлів
mov AH,52h
Int 21h
les DI,ES:[BX+4] ;ES:DI->перша SFT сmр CX,ES:[OI+4] ;Індекс у цій SFT?
jb here ;І
sub CX,ES:[DI+4] ;Немає, віднімемо число блоків у цій ;SFT
les DI,ES:[OI] ;ES:DI->друга SFT
here:
;Знайшли ту SFT, у котрій наш індекс
mov AX,59 ;Розмір блока опису файла
mul CL
add DI,6 ;ЕS:DI->перший блок опису файла
add DI,AX ;ЕS:DI->блок опису файла
mov AX,ES:[DI+llh] ;АХ=молодше слово довжини
mov DX,ES:[DI+13h] ;DХ=старше слово довжини
les DI,ES:[DI+7] ;ЕS:DI=вказівник на DPB
mov BL,ES:[DI+4] ;ВL=номер старшого сектора кластера
inc BL ;BL=число секторів у кластері
xor BH,BH ;ВХ-число секторів у кластері
mov CL,9 ;Зсув на 9 бітій = множення на 512
shl BX,CL ;вх=число байтів у кластері
mov SI,BX ;Збережемо розмір кластера в SI
d1v BX ;DX:AX/BX.
push DX ;Збережемо у стекі залишок
;Встановимо вказівник на кінець файла
mov AH,42h
mov AL,2 ;Режим установки від кінця файла
mov BX,handle
mov CX,O ;0 байтів
mov DX,O ;відкінцяфайла
1nt 21h
;чи потрібна корекція довжини файла? Файл треба подовжити,
;якщо залишок дорівнює 0 або дорівнює довжині кластера-1.
pop DX ; Витягнемо зі стека залишок
dec SI ;SI-число байтів у кластері-1
cmp DX,0 ;Залишок дорівнює 0?
je incr ;Так, на корекцію
cmp DX.SI ;Залишок дорівнює довжині кластера-1?
je incr ;Так, на корекцію
jmp good ;корекція не потрібна
;Збільшемо файл на два байти, щоб він зайняв ще один кластер
incr:
mov AH,40h
mov BX,handle
mov CX.2
mov OX, offset null
Int 21h
jmp good ;Ha записключазамежаминовоїдовжинифайла
good:
;Запишемо за межами файла ключ
mov АН,40h
mov ВХ,handle
mov СХ,2
mov OX,offset key
Int 21h ;Зрушимопокажчикнастарийкінецьфайла, щобвідділитиключвідфайла
mov AH,42h
mov AL,2 ;Режимустановкивідкінцяфайла
mov ВХ,handle
mov СХ,-1 ;СХ:DХ=машиннеуявлення
mov DX,-2 ;числа -2
int 21h
; Виконаємо фіктивний запис 0 байтів, щоб укоротить файл
;до старої довжини
mov AH,40h
mov ВХ,handle
mov СХ.0
mov DX,offset key ;Фіктивний параметр
Int 21h ;Виведемо повідомлення mes про нормальну роботу
;Завершимо програму
notopen:
;Виведемо повідомлення mes2 про неможливість відкрити файл
jmp outprog ;Поля даних
fname db 'work3.exe',0 ;Ім'я файла handle dw 0 ;Осередок для дескриптора
key dw 1234h ;Ключ, що записується у файл
null dw 0
mes db 'Программа WORK3.EXE установлена на жорсткому дискі',10,13
mes2 db 'Файл WORK3.EXE не відкрився',10,13
Блок-схема алгоритму
1. Блок-схема робочої програми WORK3.EXE.
2. Блок-схема установочної програми INSTALL3.EXE.