.model tiny
.code
.startup
jmp init ;на инициализацию
New13h: ;новый вектор 13h
cmp ax, 1234h ;проверка на повторную инсталяцию
jne CmpFormat
mov ax, 4321h ;программа уже инсталирована
iret
CmpFormat:
cmp ah, 05h ;формат?
jne ToOld13h ;нет - на старый вектор
;просто stc ничего не даст,
; после iret флаг потеряется!
push bp ;Но, флаг FC мы можем взвести в стеке!
mov bp, sp ;будем адресовать с помощью bp
or byte ptr [bp+6], 1 ;в стеке: [bp] = старый bp
; [bp+2] = IP
; [bp+4] = CS
; [bp+6] = FLAGS
;0001h - маска флага C
pop bp ;восстановим bp
mov ah, 3 ;код ошибки "Защита записи"
iret ;выход из прерывания,
; по выходу взведется флаг FC
ToOld13h:
jmp cs:dword ptr old13h ;все остальное на отработку
; по старому вектору
old13h dw ?, ? ;адрес старого вектора 13h
init: ;инициализация
mov ax, 1234h ;проверим на повторную загрузку
int 13h
cmp ax, 4321h
je finish ;просто завершаемся
push bx es
mov ax, 3513h ;узнаем адрес старого вектора
int 21h ; в es:bx
mov old13h, bx ;сохраняем
mov old13h+2, es
pop es bx
lea dx, New13h ;устанавливаем новый вектор 13h
mov ax, 2513h
int 21h
lea dx, loaded ;сообщение
mov ah, 9
int 21h
lea dx, init ;оставляем в памяти резидентом
int 27h ; до адреса init
finish:
lea dx, already ;сообщение
mov ah, 9
int 21h
mov ax, 4c00h ;обычный выход при повторной загрузке
int 21h
.data
loaded db 'Program loaded$'
already db 'Program already loaded$'
end
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.