На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> DOS: проблема при работе с файлами из TSR-программы
    Здравствуйте. Пишу на C и ассемблере (tcc/tasm) резидентную программу под DOS, которая должна перехватывать прерывание клавиатуры и сохранять на диске файл. На виртуальной машине Windows ntvdm всё работает, а на VMware Player (который, как я понял, ближе к реальному DOS) виснет при попытке создать файл. Пробовал работать с файлами как с помощью стандартных библиотечных функций C, так и напрямую вызывать функции DOS int 21h.

    В обработчике прерываний сохраняю все регистры (pusha/popa), устанавливаю свой ds и свой стек (потом естественно возвращаю обратно). Кроме этого, устанавливаю свой ID процесса (адрес PSP) с помощью функции DOS 50h. И всё равно виснет.

    Установил, что виснет при вызове функции DOS создания файла. Может быть я что-то ещё забыл инициализировать в обработчике прерывания?
      Ты забыл, что DOS не реентерабельна. Вызов функций DOS внутри обработчика аппаратного прерывания, который может быть вызван внутри функции DOS, грозит большими неприятностями.
        Я сделал такой эксперимент: вызвал прерывание клавиатуры в тот момент, когда выполнялась программа, состоящая из одной строки while(1); При этом проверял флаг активности DOS (адрес которого получил при инициализации TSR-программы с помощью функции 34h). Флаг активности - нулевой, т.е. в момент выполнения while(1); DOS разрешает вызывать свои функции. И всё равно при таком раскладе тоже виснет.

        Может быть это как-то связано с файловой системой DOS? Догадываюсь, что ntvdm использует не реальную файловую систему DOS, а всё таки Windows-овскую (т.к. файлы там сохраняются на реальном диске в системе NTFS). Поэтому наверное в ntvdm проблем и не возникает.
          Цитата Зойберг @
          Может быть это как-то связано с файловой системой DOS?

          Нет, ты делаешь какую-то ошибку связанную с обработкой прерывания. NTVDM вообще большую часть аппаратных ошибок и возможностей железа просто игнорит. Даю 50%, что неправильно считываешь данные или отправляешь команды железке, возможно не шлешь EOI. Даю 40% на то, что ты перетираешь (невалидными указателями, etc) системные области DOS или BIOS. Более конкретно только после ознакомления с кодом.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0278 ]   [ 15 queries used ]   [ Generated: 2.05.24, 14:54 GMT ]