Нашёл информацию о том, что для удаления DOS может использовать функцию 13h от прерывания 21h. В интернете информации об этом немного, а в Абеле и вовсе нет. Попробую поискать. UP: Нет, удаление идёт всё-таки не через функцию 13h
Код (Text): push CS pop DS ............... mov AL, [SI] Имя файла в DSX и DS из проги удаляющей файл не равен твоему CS ! В стародавнии времена, когда отладчиков почти не было я отладочную печать бросал в старшие адреса и смотрел через debug.com Ну нельзя вслепую такие вещи прогать, когда еще азбука не на автомате...
Einior Функция 13h - удалить файл, используя FCB. Код (Text): AH=13h DS:DX->FCB Имя в FCB может содержать символы '?', что означает любой символ. Возвращает: AL=00h файл найден AL=FFh файл не найден Если обработчик срабатывает, тогда вместо очистки экрана надо выводить номер функции, и таким образом посмотреть какие функции вызываются, а в гадании смысла нет.
valterg Это код из первого поста, он уже исправлен skomarov Да, я знаю про FCB. Просто первый раз с этим столкнулся. Номер функции пробовал выводить (через прерывание BIOS). Если запустить под Волковым, то там постоянно вызывается функция 44h. Постоянно, в смысле, беспрерывно - весь экран заполняется. Если запускать под cmd, то отрабатывает функция 25h (странно, почему) и 40h. Такое предположение появилось. DOS ведь работает с FAT. А мои диски под NTFS. Может, дело в этом? В приложении на всякий случай код всей программы
а ты проверь под чистым досом, с фатом, тогда никаких сомнений не останется, где проблема. VirtualBox поможет.
Einior В системе Windows XP под cmd.exe/command.com удаление происходит не через int 21h. В системе Windows XP под cmd.exe/command.com + VC.exe сначала формируется FCB AH=29h, затем удаляется файл AH=13h. В системе Windows XP под cmd.exe/command.com + DN.exe удаляется также через FCB. В системе MSDOS 6.22 удаляется также через FCB. В моем случае cmd.exe/command.com + VC.exe постоянно обновляет время (AH=2C), но это решается простым фильтром на код функции.
Einior Все изменения находятся в блоках debug, основной код не изменял. Добавил функции отладки show_func и show_fcb (выводит только имя файла), и добавил вызовы в обработчик int 21h. В структуре FCB расширение имени файла находится по смещению +9 и занимает 3 байта, незначащие символы замещаются пробелами. Это упростит анализ имени файла.
Einior Думаю, что надо исходить из того, что задача является системо-зависимой, поэтому ориентироваться на версии DOS и соответственно отлаживать в такой системе, а в пределах системы уже перехватывать все варианты удаления, в том числе и переименование файла, а для этого не только проверять с помощью стандартных инструментов (del, vc), но и создать для каждого случая свои небольшие тестовые программы удаления, так же проверять функцию DOS (AX=5D00). В общем, могу сказать, что задача хорошая, многоплановая.
skomarov Ага, это только на первый взгляд задача показалась мне лёгкой. Самое интересное, что это задание сдавали до меня уже лет 5-6 подряд. Везде отлавливалась функция 41h. Запускалось всё под cmd + vc. И программа работала, и сдавалась. Думаю, прежде чем браться за проработку всех вариантов, нужно хотя бы что-нибудь одно отладить. Сейчас попробовал всё переписать под отлов функции 13h - не получилось, файл удаляется. Я правильно, понимаю, что в DSX при вызове 13h содержится адрес области памяти в FCB? У меня такое ощущение, что с сегментными регистрами опять что-то не так. Хотя DS не изменял, ES настроил. Прогонял код в эмуляторе. Если в DX загрузить адрес чего-нибудь, похожего на FCB, например: Код (Text): file db 5, 'test txt', 21 dup (0) то алгоритм поиска подстроки работает. Вот новый обработчик. Код (Text): new_21h proc cmp AH, 13h ;функция удаления по FCB, DS:DX содержит FCB je work ;работаем по нашей функции jmp exit_21h ;иначе уход в старый обработчик без возврата work: call show_func push AX push BX push CX push DX push DI push SI push ES push CS pop ES mov SI, DX ;SI <- FCB add SI, 9h ;расширение находится по смещению +9 и занимает 3 байта mov BX, SI ;копируем SI в BX, понадобится при поиске mov AX, offset CS:extensions ;смещение extensions, первого символа mov DX, AX add DX, ex_len ;смещение первого байта после extensions sub DX, 2 ;смещение предпоследнего символа cld ;DF=0, движение вправо search_string: mov DI, AX cmp DI, DX ;дошли до предпоследнего символа - дальше нет смысла проверять je delete_file mov CX, 3h ;ожидаемая длина расширения repe cmpsb mov SI, BX ;возвращаем BX в предыдущее состояние cmp CX, 0h ;найдено совпадение je found inc AX jmp search_string found: not_delete_file: pop ES pop SI pop DI pop DX pop CX pop BX pop AX mov AL, 0FFh ;код ошибки - доступ запрещён iret delete_file: pop ES pop SI pop DI pop DX pop CX pop BX pop AX exit_21h: jmp DWPTR CS:[old_21h] new_21h endp
Einior Возможно, что для лабораторной достаточно и одной функции, но тщательная проработка даже простой лабораторной формирует на будущее необходимые навыки в самом человеке. Да и преподавателю всегда приятно увидеть оригинальное решение. Да, правильно. Поищи "TechHelp! 6.0", там все написано, кроме функции 5D00. Сегментные регистры настроены правильно, хотя алгоритм проверки можно упростить. Ошибка заключается в том, что в FCB имя файла и расширение заглавными буквами, а в твоих данных - строчными.
Пара замечаний. В начале для универсальности добавляем: Код (Text): .386 code_seg segment USE16 Надо добавить в boot: команды Код (Text): push cs pop cs Тоже самое перед вызовом print. Если делать exe, а не com то CS != DS и прога не работает. Досбокс реализует команды не через ДОС-прерывания. Соответственно проверить ничего нельзя. У меня Волков 4.05 и он благополучно убивает перехват 21h и в ХП и в Досбоксе Если сначала загрузить lab2, то в Досбоксе все виснет после int 21h AH=4Bh, а в ХП выдает аппаратная ошибка ntvdm