Консультация № 178568
22.05.2010, 18:22
42.57 руб.
0 7 1
Уважаемые эксперты! Требуется написать программу(с комментариями) Разработать резидентную программу для ОС MSDOS.Программа может быть выполнена в виде exe или com файла. При попытке отформатировать диск программа выдает сообщение о невозможности такой операции и всегда возвращает вызвавшей программе код ошибки.
Ассемблер TASM.

Обсуждение

Неизвестный
22.05.2010, 18:28
общий
Благодарность гарантирована)
давно
Посетитель
7438
7205
23.05.2010, 22:20
общий
это ответ
Здравствуйте, Филимонов Алексей Викторович.
Примерная программа ниже. Программа перехватывает выполнение функции 5 (форматирование) и в случае попытки форматировать взводит флаг C и возвращает код ошибки "защиты записи".
К сожалению, проверить не могу, флоппи нет в принципе, а на жестком не хочется пробывать...
Код:

.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
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.05.2010, 13:06
общий
Вот держите благодарность)
давно
Посетитель
7438
7205
25.05.2010, 13:16
общий
Филимонов Алексей Викторович:
Премного благодарен
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.05.2010, 13:54
общий
Пришли деньги?
давно
Посетитель
7438
7205
25.05.2010, 14:07
общий
Филимонов Алексей Викторович:
Да, конечно, спасибо
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.05.2010, 14:13
общий
Форма ответа