Dos fn 4ch завершить программу exit


Содержание

Команда EXIT – завершить работу командного процессора или текущего командного файла.

&nbsp &nbsp Команда EXIT используется для завершения пакетных файлов с установкой значения переменной ERRORLEVEL или для завершения командного процессора CMD.EXE ( для выхода из командной строки), если она выполняется вне пакетного файла.

Формат командной строки:

EXIT [/B] [exitCode]

Параметры командной строки:

/B — Предписывает завершить текущий пакетный файл-сценарий вместо завершения CMD.EXE. Если выполняется вне пакетного файла-сценария, то будет завершена программа CMD.EXE

exitCode — Указывает цифровое значение. Если указан ключ /B, определяет номер для ERRORLEVEL. В случае завершения работы CMD.EXE, устанавливает код завершения процесс с данным номером.

Примеры использования команды EXIT

exit — завершить текущий сеанс CMD

Команда EXIT с параметрами используются, как правило, только в командных файлах. Например, для индикации результата выполнения с установкой значения переменной среды ERRORLEVEL

REM перейти к метке, где выполняется выход с ERRORLEVEL=0

REM перейти к метке, где выполняется выход с ERRORLEVEL=1

REM установить ERRORLEVEL равный 0 и завершить работу

REM установить ERRORLEVEL равный 1 и завершить работу

Параметр /B используется в тех случаях, когда выполняется завершение командного файла, но необходимо продолжить работу командного процессора. Например, когда командный файл 1.bat вызывает командной CALL другой командный файл 2.bat , результат выполнения которого, характеризуется значением переменной окружения ERRORLEVEL . Если в вызываемом командном файле использовать команду EXIT без параметра /B, то будет завершена работа вызываемого файла 2.bat, а также вызывающего файла 1 .bat и интерпретатора CMD.EXE, т.е вместо выхода из вызываемого файла будет полностью завершен сеанс командной строки.

Простейший пример, когда командный файл 1.bat вызывает на выполнение другой командный файл с именем 2.bat и выводит на экран значение ERRORLEVEL, установленное при выходе из вызываемого файла:

echo Batch file 2.bat executed with ERRORLEVEL = %ERRORLEVEL%

Файл 2.bat завершается командой EXIT с установкой значения ERRORLEVEL, равного 128:

При выполнении командного файла 1.bat на экран будет выведено сообщение:

Batch file 2.bat executed with ERRORLEVEL = 128

Попробуйте убрать параметр /B в команде EXIT командного файла 2.bat и оцените полученный результат.

Ассемблер

Прерывание 21h: общие функции DOS

Все функции DOS вызываются с помощью прерывания 21h (в десятичной нотации 33). Первая версия DOS содержала 42 функции. Во второй к ним добавлено еще 33 функции, которые сохраняются во всех последующих версиях. Выбор конкретной функции осуществляется путем записи соответствующего номера в регистр AH.

Функция 02: вывод одного символа на экран

Для вывода одного символа на экран ПК используется

функция 02 прерывания 21h:

Выводимый символ высвечивается в позиции курсора (что бы там ни было записано), после чего курсор сдвигается на одну позицию вправо. Если курсор находился в конце строки экрана, то он перемещается на начало следующей строки, а если курсор был в конце последней строки экрана, то содержимое экрана сдвигается на одну строку вверх, а внизу появляется пустая строка, в начало которой и устанавливается курсор.

Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (0Ah) и 13 (0Dh). Символ с кодом 7 (bell, звонок) на экране не высвечивается (и курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (backspase, шаг назад) возвращает курсор на одну позицию влево, если только он не был в самой левой позиции строки. Символ с кодом 9 (tab, табуляция) смещает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (line feed, перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ с кодом 13 (carrige returne, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки.

Функция 9: вывести строку на экран дисплея

Для вывода на экран строки (последовательности символов) можно, конечно, использовать функцию 02, однако сделать это можно и за один прием с помощью функции 09 прерывания 21h:

DS:DX := начальный адрес строки

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX — смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.

Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.

Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.

Среди функций DOS нет такой, которая выводит числа. Такую операцию, если надо, приходится реализовывать на основе рассмотренных функций.

Функция 4Ch: завершение программы

Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:

Каждая программа, вообще говоря, обязана сообщить, успешно или нет она завершила свою работу. Дело в том, что любая программа вызывается из какой-то другой программы (например, из операционной системы), и иногда вызвавшей программе, чтобы правильно продолжить работу, надо знать, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информация передается в виде кода завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, и ненулевым (каким именно — оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной программы можно с помощью функции 4Dh прерывания 21h.) Потребуется этот код или нет, программа все равно должна выдать его.

Асемблер различия функции 4C и вызова прерывания 21h от прерывания 20h (ассемблер)


Какие всё же различия функции 4C и вызова прерывания 21h от прерывания 20h, ведь и то, и другое вызывает завершение программы.

Ответы (1)

Можно же открыть документацию и посмотреть. Уделите внимание требованию равенства CS=PSP и выполнению этого правила в .EXE и .COM программах и различии в проверке этого равенства в этих прерываниях. При INT 20h соблюдение данного правила в файлах .EXE лежит на программисте.

INT 20H — Завершить программу

Это прерывание используется для выхода из программы и возврата управления родительскому процессу (обычно интерпретатору команд DOS — COMMAND.COM). Оно восстанавливает значения управляющих векторов INT 22H INT 23H INT 24H. Оно также сбрасывает все файловые буфера (если длина файла изменилась, то файл должен быть предварительно закрыт).

Важно: Регистр CS должен содержать значение PSP завершающегося процесса. Если ваш CS не равен PSP, вы можете выдать JMP или RET на PSP:0000.

Рекомендуется использовать функцию 4cH Terminate, чтобы избежать трудностей, связанных с неравенством CS и PSP. Она позволяет также задать код выхода. Программы COM-формата обычно выполняются при CS=PSP, так что им можно выдавать INT 20H в любой момент. EXE-программы могут выдавать FAR JMP или FAR RET, чтобы передать управление на PSP:0000, где содержится инструкция INT 20H.

INT 21H — Сервис DOS Fn 4cH — Завершить программу — EXIT

возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dH WAIT. Управление передается по адресу завершения в PSP завершающейся программы. векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненнмы в родительском PSP.

Замечание:
значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.

Dos fn 4ch: завершить программу exit

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 1154
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 457
solowey
Статус: Бакалавр
Рейтинг: 235
Перейти к консультации №:

Здравствуйте! У меня возникли сложности с таким вопросом:
Что означает информация «Terminated, exit code 0», появляющаяся в отладчике Turbo Debugger, после завершения исследуемой программы?
Что это за «код выхода» (… exit code 0)?
Так уж необходим этот «код выхода»?
Какие еще бывают «коды выхода»?

Что такое EXIT TO DOS (4).PIF и как его исправить?

Совместима с Windows XP, Vista, 7, 8 и 10

Обзор EXIT TO DOS (4).PIF

Что такое EXIT TO DOS (4).PIF?

EXIT TO DOS (4).PIF представляет собой разновидность файла PIF, связанного с System CD, который разработан Gateway для ОС Windows. Последняя известная версия EXIT TO DOS (4).PIF: 1.0.0.0, разработана для Windows. Данный файл PIF имеет рейтинг популярности 1 звезд и рейтинг безопасности «Неизвестно».

Почему у меня наблюдаются ошибки в файлах типа PIF?

Если Windows не может нормально загрузить файл EXIT TO DOS (4).PIF, или файл PIF заражен вирусом или вредоносным ПО, вы увидите сообщение об ошибке. Для получения дополнительной информации см. «Причины ошибок EXIT TO DOS (4).PIF» ниже.

В каких случаях появляются ошибки в файлах типа PIF?

Ошибки PIF, например, связанные с EXIT TO DOS (4).PIF, чаще всего появляются во время запуска компьютера, запуска программы или при попытке использования специфических функций в вашей программе (например, печать).

Распространенные сообщения об ошибках в EXIT TO DOS (4).PIF

Наиболее распространенные ошибки EXIT TO DOS (4).PIF, которые могут возникнуть на компьютере под управлением Windows, перечислены ниже:

  • «Ошибка в файле EXIT TO DOS (4).PIF.»
  • «Отсутствует файл EXIT TO DOS (4).PIF.»
  • «EXIT TO DOS (4).PIF не найден.»
  • «Не удалось загрузить EXIT TO DOS (4).PIF.»
  • «Не удалось зарегистрировать EXIT TO DOS (4).PIF.»
  • «Ошибка выполнения: EXIT TO DOS (4).PIF.»
  • «Ошибка загрузки EXIT TO DOS (4).PIF.»

Такие сообщения об ошибках PIF могут появляться в процессе установки программы, когда запущена программа, связанная с EXIT TO DOS (4).PIF (например, System CD), при запуске или завершении работы Windows, или даже при установке операционной системы Windows. Отслеживание момента появления ошибки EXIT TO DOS (4).PIF является важной информацией при устранении проблемы.

PIF
EXIT TO DOS (4).PIF

Причины ошибок в файле EXIT TO DOS (4).PIF

Проблемы EXIT TO DOS (4).PIF могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с EXIT TO DOS (4).PIF, или к вирусам / вредоносному ПО.

Более конкретно, данные ошибки EXIT TO DOS (4).PIF могут быть вызваны следующими причинами:

  • Поврежденные ключи реестра Windows, связанные с EXIT TO DOS (4).PIF / System CD.
  • Вирус или вредоносное ПО, которые повредили файл EXIT TO DOS (4).PIF или связанные с System CD программные файлы.
  • Другая программа злонамеренно или по ошибке удалила файлы, связанные с EXIT TO DOS (4).PIF.
  • Другая программа находится в конфликте с System CD и его общими файлами ссылок.
  • Поврежденная загрузка или неполная установка программного обеспечения System CD.

Как исправить ошибки в EXIT TO DOS (4).PIF

Ниже описана последовательность действий по устранению ошибок, призванная решить проблемы EXIT TO DOS (4).PIF. Данная последовательность приведена в порядке от простого к сложному и от менее затратного по времени к более затратному, поэтому мы настоятельно рекомендуем следовать данной инструкции по порядку, чтобы избежать ненужных затрат времени и усилий.

Пожалуйста, учтите: Нажмите на изображение [ ] , чтобы развернуть инструкции по устранению проблем по каждому из шагов ниже. Вы также можете использовать изображение [ ], чтобы скрывать инструкции по мере их выполнения.


Шаг 1: Исправить записи реестра, связанные с System CD

Иногда ошибки EXIT TO DOS (4).PIF и другие системные ошибки PIF могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл EXIT TO DOS (4).PIF, но когда эти программы удалены или изменены, иногда остаются «осиротевшие» (ошибочные) записи реестра PIF.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка EXIT TO DOS (4).PIF. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с System CD. Таким образом, эти поврежденные записи реестра PIF необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей EXIT TO DOS (4).PIF не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как WinThruster (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с EXIT TO DOS (4).PIF. Используя очистку реестра, вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку EXIT TO DOS (4).PIF) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.

Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с EXIT TO DOS (4).PIF (например, System CD):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска. ПОКА НЕ НАЖИМАЙТЕENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «regedit» и нажмите ENTER.
  8. В Редакторе реестра выберите ключ, связанный с EXIT TO DOS (4).PIF (например, System CD), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт.
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа System CD.
  11. В поле Имя файла введите название файла резервной копии, например «System CD резервная копия».
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь.
  13. Нажмите Сохранить.
  14. Файл будет сохранен с расширением .reg.
  15. Теперь у вас есть резервная копия записи реестра, связанной с EXIT TO DOS (4).PIF.

Следующие шаги при ручном редактировании реестра не будут описаны в данной статье, так как с большой вероятностью могут привести к повреждению вашей системы. Если вы хотите получить больше информации о редактировании реестра вручную, пожалуйста, ознакомьтесь со ссылками ниже.

Мы не несем никакой ответственности за результаты действий, совершенных по инструкции, приведенной ниже — вы выполняете эти задачи на свой ​​страх и риск.

Шаг 2: Проведите полное сканирование вашего компьютера на вредоносное ПО

Есть вероятность, что ошибка EXIT TO DOS (4).PIF может быть связана с заражением вашего компьютера вредоносным ПО. Эти вредоносные злоумышленники могут повредить или даже удалить файлы, связанные с PIF. Кроме того, существует возможность, что ошибка EXIT TO DOS (4).PIF связана с компонентом самой вредоносной программы.

Совет: Если у вас еще не установлены средства для защиты от вредоносного ПО, мы настоятельно рекомендуем использовать Emsisoft Anti-Malware (скачать). В отличие от других защитных программ, данная программа предлагает гарантию удаления вредоносного ПО.

Шаг 3: Очистить систему от мусора (временных файлов и папок) с помощью очистки диска (cleanmgr)

Со временем ваш компьютер накапливает ненужные файлы в связи с обычным интернет-серфингом и повседневным использованием компьютера. Если такие ненужные файлы иногда не удалять, они могут привести к снижению быстродействия System CD или к ошибке EXIT TO DOS (4).PIF, возможно вследствие конфликтов файлов или перегрузки жесткого диска. Удаление таких временных файлов при помощи утилиты Очистка диска может не только устранить ошибку EXIT TO DOS (4).PIF, но и существенно повысить быстродействие вашего компьютера.

Совет: Хотя утилита Очистки диска является прекрасным встроенным инструментом, она удаляет не все временные файлы с вашего компьютера. Другие часто используемые программы, такие как Microsoft Office, Firefox, Chrome, Live Messenger, а также сотни других программ не поддаются очистке при помощи программы Очистка диска (включая некоторые программы Gateway).

Из-за недостатков утилиты Windows Очистка диска (cleanmgr) мы настоятельно рекомендуем использовать специализированное программное обеспечение очистки жесткого диска / защиты конфиденциальности, например WinSweeper (разработано Microsoft Gold Partner), для очистки всего компьютера. Запуск WinSweeper раз в день (при помощи автоматического сканирования) гарантирует, что ваш компьютер всегда будет чист, будет работает быстро и без ошибок EXIT TO DOS (4).PIF, связанных с временными файлами.

Как запустить Очистку диска (cleanmgr) (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска. ПОКА НЕ НАЖИМАЙТЕENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «cleanmgr» и нажмите ENTER.
  8. Программа Очистка диска приступит к подсчету занятого места на диске, которое вы можете освободить.
  9. Будет открыто диалоговое окно Очистка диска, содержащее флажки, которые вы можете выбрать. В большинстве случаев категория «Временные файлы» занимает большую часть дискового пространства.
  10. Установите флажки напротив категорий, которые вы хотите использовать для очистки диска, и нажмите OK.

Шаг 4: Обновите драйверы устройств на вашем компьютере

Ошибки EXIT TO DOS (4).PIF могут быть связаны с повреждением или устареванием драйверов устройств. Драйверы с легкостью могут работать сегодня и перестать работать завтра по целому ряду причин. Хорошая новость состоит в том, что чаще всего вы можете обновить драйверы устройства, чтобы устранить проблему с PIF.

В связи с временными затратами и общей сложностью обновления драйверов мы настоятельно рекомендуем использовать утилиту обновления драйверов, например DriverDoc (разработана Microsoft Gold Partner), для автоматизации этого процесса.

Пожалуйста, учтите: Ваш файл EXIT TO DOS (4).PIF может и не быть связан с проблемами в драйверах устройств, но всегда полезно убедиться, что на вашем компьютере установлены новейшие версии драйверов оборудования, чтобы максимизировать производительность вашего ПК.

Шаг 5: Используйте Восстановление системы Windows, чтобы «Отменить» последние изменения в системе

Восстановление системы Windows позволяет вашему компьютеру «отправиться в прошлое», чтобы исправить проблемы EXIT TO DOS (4).PIF. Восстановление системы может вернуть системные файлы и программы на вашем компьютере к тому времени, когда все работало нормально. Это потенциально может помочь вам избежать головной боли от устранения ошибок, связанных с PIF.

Пожалуйста, учтите: использование восстановления системы не повлияет на ваши документы, изображения или другие данные.

Чтобы использовать Восстановление системы (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. В строке поиска введите «Восстановление системы» и нажмите ENTER.
  3. В окне результатов нажмите Восстановление системы.
  4. Введите пароль администратора (при появлении запроса).
  5. Следуйте инструкциям Мастера для выбора точки восстановления.
  6. Восстановить ваш компьютер.

Шаг 6: Удалите и установите заново программу System CD, связанную с EXIT TO DOS (4).PIF

Инструкции для Windows 7 и Windows Vista:

  1. Откройте «Программы и компоненты», нажав на кнопку Пуск.
  2. Нажмите Панель управления в меню справа.
  3. Нажмите Программы.
  4. Нажмите Программы и компоненты.
  5. Найдите System CD в столбце Имя.
  6. Нажмите на запись System CD.
  7. Нажмите на кнопку Удалить в верхней ленте меню.
  8. Следуйте инструкциям на экране для завершения удаления System CD.

Инструкции для Windows XP:

  1. Откройте «Программы и компоненты», нажав на кнопку Пуск.
  2. Нажмите Панель управления.
  3. Нажмите Установка и удаление программ.
  4. Найдите System CD в списке Установленные программы.
  5. Нажмите на запись System CD.
  6. Нажмите на кнопку Удалить справа.
  7. Следуйте инструкциям на экране для завершения удаления System CD.

Инструкции для Windows 8:


  1. Установите указатель мыши в левой нижней части экрана для показа изображения меню Пуск.
  2. Щелкните правой кнопкой мыши для вызова Контекстного меню Пуск.
  3. Нажмите Программы и компоненты.
  4. Найдите System CD в столбце Имя.
  5. Нажмите на запись System CD.
  6. Нажмите Удалить/изменить в верхней ленте меню.
  7. Следуйте инструкциям на экране для завершения удаления System CD.

После того, как вы успешно удалили программу, связанную с EXIT TO DOS (4).PIF (например, System CD), заново установите данную программу, следуя инструкции Gateway.

Совет: Если вы абсолютно уверены, что ошибка PIF связана с определенной программой Gateway, удаление и повторная установка программы, связанной с EXIT TO DOS (4).PIF с большой вероятностью решит вашу проблему.

Шаг 7: Запустите проверку системных файлов Windows («sfc /scannow»)

Проверка системных файлов представляет собой удобный инструмент, включаемый в состав Windows, который позволяет просканировать и восстановить поврежденные системные файлы Windows (включая те, которые имеют отношение к EXIT TO DOS (4).PIF). Если утилита проверки системных файлов обнаружила проблему в PIF или другом важном системном файле, она предпримет попытку заменить проблемные файлы автоматически.

Чтобы запустить проверку системных файлов (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска. ПОКА НЕ НАЖИМАЙТЕENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «sfc /scannow» и нажмите ENTER.
  8. Проверка системных файлов начнет сканирование на наличие проблем EXIT TO DOS (4).PIF и других системных файлов (проявите терпение — проверка может занять длительное время).
  9. Следуйте командам на экране.

Шаг 8: Установите все доступные обновления Windows

Microsoft постоянно обновляет и улучшает системные файлы Windows, связанные с EXIT TO DOS (4).PIF. Иногда для решения проблемы PIF нужно просто напросто обновить Windows при помощи последнего пакета обновлений или другого патча, которые Microsoft выпускает на постоянной основе.

Чтобы проверить наличие обновлений Windows (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «update» в строке поиска и нажмите ENTER.
  3. Будет открыто диалоговое окно Обновление Windows.
  4. Если имеются доступные обновления, нажмите на кнопку Установить обновления.

Шаг 9: Произведите чистую установку Windows

Предупреждение: Мы должны подчеркнуть, что переустановка Windows займет очень много времени и является слишком сложной задачей, чтобы решить проблемы EXIT TO DOS (4).PIF. Во избежание потери данных вы должны быть уверены, что вы создали резервные копии всех важных документов, изображений, программ установки программного обеспечения и других персональных данных перед началом процесса. Если вы сейчас е создаете резервные копии данных, вам стоит немедленно заняться этим (скачать рекомендованное решение для резервного копирования), чтобы защитить себя от безвозвратной потери данных.

Пожалуйста, учтите: Если проблема EXIT TO DOS (4).PIF не устранена после чистой установки Windows, это означает, что проблема PIF ОБЯЗАТЕЛЬНО связана с аппаратным обеспечением. В таком случае, вам, вероятно, придется заменить соответствующее оборудование, вызывающее ошибку EXIT TO DOS (4).PIF.

Имя файла: EXIT TO DOS (4).PIF Последняя известная версия: 1.0.0.0
Разработчик: Gateway Размер файла (байтов): 1479
Программное обеспечение: System CD Операционная система: Windows
Описание: 1.7
MD5: 708F0BE07CEEA43677F4889903674589
SHA1: E8FF07ADE630334260BBBC24ADAB843FA18A00BA

Информация об операционной системе

Сообщения об ошибках EXIT TO DOS (4).PIF могут появляться в любых из нижеперечисленных операционных систем Microsoft Windows:

  • Windows 10
  • Windows 8
  • Windows 7
  • Windows Vista
  • Windows XP
  • Windows ME
  • Windows 2000

Проблема с EXIT TO DOS (4).PIF все еще не устранена?

Обращайтесь к нам в любое время в социальных сетях для получения дополнительной помощи:

Об авторе: Джей Гитер (Jay Geater) является президентом и генеральным директором корпорации Solvusoft — глобальной компании, занимающейся программным обеспечением и уделяющей основное внимание новаторским сервисным программам. Он всю жизнь страстно увлекался компьютерами и любит все, связанное с компьютерами, программным обеспечением и новыми технологиями.

Отобразить файлы PIF в алфавитном порядке:

Вы загружаете пробное программное обеспечение. Подписка на один год стоимостью $39,95 необходима для разблокировки всех функций приложения. Подписка обновляется автоматически по завершению (Узнать больше). Нажав на кнопку «Начать загрузку» и установив «Софт»», я подтверждаю, что прочитал(а) и согласен(на) с Пользовательским соглашением и Политикой конфиденциальности Solvusoft.

Dos fn 4ch: завершить программу exit

Связь с администрацией сайта:

Среди толпы я одинок

  • Вы здесь:
  • Home >
  • Блог >
  • Документация и курсы >
  • Самоучитель по ассемблеру >
  • Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

Глава 18 — практика: работа с файлами, перехват и восстановление прерываний


  • Written by Administrator
  • Tagged under АссемблерAssemblerСамоучитель по ассемблеру
  • Print

Замечание! Это пожалуй самая большая глава! информация представленная в ней в принципе довольно важна! К сожалению при работе в NT/Windows 2000/XP вам не удастся опробовать пример! Тут нужен чистый DOS, или хотя бы Win9x! Я например воспользуюсь эмулятором!

Работа с файлами через описатели

Если программы, написанные на языках высокого уровня могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.
Начиная с DOS версии 2.0, в набор функций прерывания 21h включе-ны UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Ниже приведен перечень наиболее часто используемых функций пре-рывания 21h для работы с файлами через описатели.
Функция 3cH
Создать файл.
Вход. AH=3ch
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет.
Описание. Файл создается в указанном (или умалчиваемом) оглав-лении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).
Функция 5bH
Создать новый файл (не должен существовать).
Вход. AH=5bh
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.
Функция 5aH
Создать уникальный файл.
Вход. AH=5ah
DS:DX=адрес строки ASCIIZ с путем (заканчивается \)
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
DS:DX (не изменяется) становится полным
ASCIIZ-именем нового файла.
Описание. Открывает (создает) файл с уникальным именем в оглав-лении, указанном строкой ASCIIZ, на которую указывает DS:DX. Описа-ние пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS:DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Ес-ли имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя.
Функция 3dH
Открыть файл.
Вход. AH=3dh
DS:DX=адрес строки ASCIIZ с именем файла
AL=режим открытия
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» ус-танавливается в 0.
Функция 3eH
Закрыть файл.
Вход. AH=3eh
BX=описатель файла
Выход. AX= код ошибки, если CF установлен
Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.
Функция 41H
Удалить файл.
Вход. AH=41h
DS:DX=адрес строки ASCIIZ с именем файла
Выход. AX=код ошибки, если CF установлен
Описание. Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изме-нить этот атрибут через функцию 43H.
Функция 42H
Установить указатель чтения/записи (можно также узнать размер файла).
Вход. AH=42h
BX=описатель файла
CX:DX=смещение указателя: (CX * 65536) + DX
AL=0 переместить к началу файла + CX:DX
AL=1 переместить к текущей позиции + CX:DX
AL=2 переместить к концу файла — CX:DX
Выход. AX=код ошибки, если CF установлен
DX:AX=новая позиция указателя файла (если нет
ошибки)
Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или за-писи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.
Функция 3fH
Читать из файла/устройства.
Вход. AH=3fh
BX=описатель файла
DS:DX=адрес буфера для чтения данных
CX=число считываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно прочитанных байт
Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей програм-мы, адресуемый через DS:DX.
Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):
1) если AX=CX, (и CF сброшен) – чтение было корректным без ошибок;
2) если AX=0 – достигнут конец файла (EOF);
3) если AX
Функция 40H
Писать в файл/устройство.
Вход. AH=40h
BX=описатель файла
DS:DX=адрес буфера, содержащего данные
CX=число записываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно записанных байт
Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX
Некоторые функции в качестве параметра используют атрибут файла. Атрибут — это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты:
x x A D V S H R
R- только чтение (нельзя обновлять или удалять);
H- скрытый;
S- системный;
V- метка тома;
D- элемент подоглавления;
A- архивный;
x- не используются.
ASCIIZ строка, содержащая имя файла, имеет вид:

«‘d:\путь\имя_файла’,0»

Если диск и/или путь опущены, они принимаются по умолчанию. После вызова функции описатель файла должен быть сохранен для последующих операций. Количество описателей в системе регламентируется файлом CONFIG.SYS.
Приведенный ниже пример иллюстрирует процесс работы с файлом через описатели в ассемблерной программе.

;Создание файла
MOV AH,3CH
MOV CX,0
LEA DX,BUF ;DS:DX – адрес ASCIIZ строки с именем
INT 21H
JC NO_CREATE ;Проверка флага переноса
. . . ;Работа с файлом
NO_CREATE:
. . .
BUF DB ‘d:\Users\1.txt’,0

Работа с файлами через DTA

Как было сказано ранее, используются два метода доступа к файлу: метод управляющего блока файла (FCB) и метод дескриптора файла. В любом случае программа при работе с файлами должна указывать место в памяти, куда будут помещаться принимаемые данные или откуда будут извлекаться выводимые. Обычно временный буфер устанавливается раз-мером в одну запись и бывает удобно описать его как строковую переменную в сегменте данных.
Буфер, используемый методом FCB доступа к файлам, называется областью обмена с диском или DTA. На этот буфер указывает условный указатель, который хранится операционной системой и который может быть изменен программой. В документации этот указатель на DTA часто сам называют DTA. Указатель на DTA устанавливается специальной функцией DOS и после того как он установлен все функции чтения/записи автоматически обращаются к нему. Это означает, что сами функции не должны содержать адрес временного буфера.
Для установки указателя на DTA используется функцию 1AH прерывания 21H (DS:DX должны указывать на первый байт DTA). Функция 2FH прерывания 21H сообщает текущую установку указателя DTA (при возврате ES:BX содержат сегмент и смещение DTA).
Префикс программного сегмента PSP обеспечивает каждую программу 128-байтным встроенным DTA, начиная со смещения 80H и до 9FH. Программа может использовать его при нехватке памяти. Первоначально указатель на DTA указывает именно на этот буфер, поэтому если программа будет использовать его, то нет нужды устанавливать указатель. Этот буфер по умолчанию особенно удобно использовать с COM файлами, где DS указывает на начало префикса программного сегмента. Для файлов EXE может потребоваться небольшой добавочный код, чтобы использовать DTA по умолчанию.

Примечание: после извлечения года к нему необходимо прибавить 1980.
Существует ряд функций для работы с файлами, используя DTA. Наиболее употребимые из них приведены ниже.
Функция 1ah
Установить адрес DTA.
Вход. AH=1aH
DS:DX=адрес для DTA
Выход. Нет
Описание. Устанавливает адрес DTA.
Функция 2fh
Дать текущий DTA.
Вход. AH=2fH
Выход. ES:BX=адрес для DTA
Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться со-хранить адрес DTA, а впоследствии восстановить его посредством функ-ции 1aH.
Функция 4eh
Найти 1-й совпадающий файл.
Вход. AH=4eH
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла для сравнения
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумевают-ся по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA.
Функция 4fh
Найти следующий совпадающий файл.
Вход. AH=4fH
DS:DX= адрес данных, возвращенных предыдущей 4eH.
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на 2bH-байтовый буфер с информаци-ей, возвращенной функцией 4eH (либо DTA, либо буфер, скопированный из DTA).Необходимо использовать эту функцию после вызова 4eH. Сле-дующее имя файла, совпадающее по обобщенному имени и атрибуту фай-ла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняе-мом DOS).
Ниже приведен фрагмент программы, иллюстрирующий организацию поиска файлов в текущем каталоге.

;Установить адрес DTA
MOV AH,01AH
LEA DX,FDTA
INT 21H
. . .
;Наити первый совпадающий файл
MOV AH,4EH
LEA DX,MASKA
MOV CX,10H
INT 21H
JC EXIT
NEXT:
. . .
;Найти следующий совпадающий файл
MOV AH,4FH
MOV CX,10H
LEA DX,MASKA
INT 21H
JNC NEXT
EXIT:
. . .
;========== DTA =========
FDTA DB 15H DUP (?)
FATTR DB ?
FTIME DW ?
FDATA DW ?
FSIZE DD ?
FNAME DB 0DH DUP (‘$’)
;========================
MASKA DB ‘*.*’,0

Структура PSP

Префикс программного сегмента PSP (Program Segment Prefics) – специальная область оперативной памяти размером 256 (100h) байт. PSP может использоваться в программе для определения имен файлов и пара-метров из командной строки, введенной при запуске программы на выпол-нение, объема доступной памяти, переменных окружения системы и так далее. После загрузки программы в память сегментные регистры DS и ES указывают на начало PSP этой программы.

Окружение DOS

DOS поддерживает область памяти, содержащую набор строк ASCIIZ, которые могут использоваться приложениями для получения некоторой системной информации и для передачи данных между программами. Эта область памяти называется окружением DOS.
Структура окружения DOS:

имя_1=значение_1«0»
имя_2=значение_2«0»
. . .
имя_N=значение_N«0»
«0»
«xxxx»
EXEC_string_1«0»
. . .
EXEC_string_NN«0»
«0»

Здесь «0» — это символ ASCII NUL (00H), а «xxxx» — 16-битовое дво-ичное значение (количество дополнительных строк).
Окружение не превышает 32K байт и начинается на границе парагра-фа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения. Используя окружение, можно найти нужное имя’ серией срав-нений строк ASCIIZ, пока не достигнута пустая строка (нулевой длины), что указывает конец окружения.
В последних версиях DOS, за концом официального окружения по-мещается дополнительная строка, которая содержит диск и путь, с которых была загружена программа. Вслед за последней строкой ASCIIZ окруже-ния находится нулевой байт, указывающий конец официального окруже-ния. Следующие два байта содержат 16-битовый двоичный счетчик допол-нительных строк (обычно 0001H). Вслед за значением счетчика находится строка ASCIIZ, содержащая путь и имя файла. Это в точности та строка, которая использовалась функцией DOS 4bH (EXEC) для загрузки и запуска программы.

Работа с прерываниями

Иногда необходимо выполнить одну из набора специальных проце-дур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее вы-полнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые иницииру-ются состоянием ЦП или командой, а вторые — сигналом, подаваемым от других компонентов системы.
Переход к процедуре прерывания осуществляется из любой програм-мы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре преры-вания должно быть сохранено состояние всех регистров и флагов, исполь-зуемых процедурой прерывания, а после окончания прерывания эти реги-стры должны быть восстановлены.
Последовательность прерывания состоит в следующем:
1) текущее значение регистра Flags включается в стек;
2) текущее значение регистра CS включается в стек;
3) текущее значение регистра IP включается в стек;
4) сбрасываются флаги IF и TF.
Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерван-ную программу осуществляется командой, которая извлекает из стека со-держимое для IP, CS и регистра флагов (обычно это команда IRET).
Адреса подпрограмм обслуживания прерываний (вектора прерыва-ний) хранятся в таблице векторов прерываний. Таблица векторов прерыва-ний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представ-ляет собой начальный адрес процедуры обработки прерывания.
Иногда в программе возникает необходимость переопределения (пе-рехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата пре-рываний состоит в следующем:
1) подготавливается FAR-процедура – новый обработчик прерыва-ний (должна заканчиваться командой IRET);
2) сохраняется старый вектор прерывания (функция 35h прерывания 21h)
3) адрес нового обработчика заносится в таблицу векторов прерыва-ний (функция 25h прерывания 21h);
4) в конце программы происходит восстановление первоначального обработчика прерываний.
Функция 35h
Вход. AH=35H
AL=номер прерывания (00H до 0ffH)
Выход. ES:BX=адрес обработчика прерывания
Описание. Возвращает значение вектора прерывания для INT (AL),
то есть загружает в BX 0000:[AL*4], а в ES –
0000:[(AL*4)+2].
Функция 25h
Вход. AH=25H
AL=номер прерывания (00H до 0ffH)
DS:DX=вектор прерывания (адрес подпрограммы)
Выход. Нет
Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равно-сильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.

Разбор практической программы

Задание: Создать текстовый файл «Dir.Txt», содержащий перечень файлов в текущем каталоге. Написать программу переопределения прерывания 05h (клавиша Print Screen).
Примечание:
1) файл «Dir.txt» можно создавать через описатели;
2) получение пути по которому была запущена программа (первая строка в файле «Dir.Txt») можно осуществить, используя окружение DOS. Для этого, во-первых, необходимо получить адрес PSP (функция 062H прерывания 21H), во-вторых, найти в нем адрес окружения DOS. В-третьих, получив из окружения DOS строку, содержащую путь и имя за-пущенного файла, выделить из нее путь к текущему каталогу;
3) на следующем этапе производится поиск первого совпадающего с маской «*.*» файла и его имя записывается в файл «Dir.Txt». Перед на-чалом поиска необходимо правильно установить атрибут файла в CX для сравнения. Далее производится поиск следующего совпадающего с маской файла, используя функцию 04FH прерывания 21H. Если такой файл най-ден, то его имя записывается в «Dir.Txt», иначе осуществляется выход из программы;
4) перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h);
5) новый обработчик прерывания должен быть FAR-процедурой;
6) для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе не-обходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, на-пример, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.

Файл fandp.asm
.model tiny
.186
.code
;благодаря этой директиве мы сразу имеем адрес окружения! :) удобно! :)
org 2Ch
okr dw ?
org 100h
start:
;так можно загрузить сегм. регистр! :)
push okr
pop es
;начали искать строку с именем в окружении DOS
xor ax,ax
xor di,di
cld
met:scasb
jne d
cmp es:[di+1],byte ptr 0
je quit
d:jmp met
quit:add di,2
xor si,si
ms:mov al,byte ptr es:[di]
cmp al,0
je poka
mov path[si],byte ptr al
inc si
inc di
jmp ms
;закончили сканировать окружение в поисках пути
;перехватываем прерывание
poka:sub si,9
mov ax,3505h
int 21h
mov word ptr oldint, bx
mov word ptr oldint+2,es
mov ax,2505h
mov dx,offset inter
int 21h
;выдаем писк! :) а то принт скрин всё равно нажать не успеем! :)
int 5h
mov ah,0h
int 16h
lea dx,mesg
mov ah,9
int 21h
;открываем файл
call openfile
mov handle,ax
mov ah,40h
mov bx,handle
mov cx,si
lea dx,path
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
;установить адрес dta
mov ah,01ah
lea dx,fdta
int 21h
;начать поиск файлов
mov ah,4eh
lea dx,maska
mov cx,10h
int 21h
jc exit
mov di,0
mov cx,14
m0:cmp fname[di],’0′
je h0
inc di
h0:loop m0
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
next:mov ah,4fh
mov cx,10h
lea dx,maska
int 21h
jc exit
mov di,0
mov cx,14
m2:cmp fname[di],’0′
je h1
inc di
h1:loop m2
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
xor ax,ax
mov di,0
mov cx,14
m1:mov fname[di],al
inc di
loop m1
jmp next
exit: mov ah,3eh
mov bx,handle
int 21h
;восстанавливаем вектор обратно
mov ax,2505h
mov dx,word ptr oldint+2
mov ds,dx
mov dx,word ptr cs:oldint
int 21h
ret
;процедура обработки прерывания
inter proc far
pusha
push es
push ds
mov dl,07
mov ah,02
int 21h
pop ds
pop es
popa
jmp cs:oldint
inter endp
;процедура открытия файла
openfile proc near
mov ah,3ch
mov cx,0
mov dx,offset buf
int 21h
jnc nerr
mov dx,offset myerr
mov ah,9
int 21h
;перевод строки
mov dx,offset crlf
mov ah,09h
int 21h
nerr: ret
openfile endp
;.
oldint dd ?
mesg db «Find files$»
crlf db 0Dh,0Ah,’$’
buf db «filedir»,0
myerr db «WARNING.
File not create$»
handle dw ?
maska db «*.*»,0
fdta db 15h dup (?)
fattr db ?
ftime dw ?
fdata dw ?
fsize dd ?
fname db 14 dup (‘0’)
path db 256 dup (?)
end start

Компиляция :
c:\specprog\tasm\bin\tasm.exe /m fandp.asm
c:\specprog\tasm\bin\tlink.exe fandp.obj /t/x

Вот что имеем в результате запуска:
(под эмулятором и на реальном DOS при запуске вы услышите «писк»)
список найденых файлов сохраняется в файле filedir

System.exit(). Какой код выхода использовать?

Что является причиной того, что java программа прекращает любую свою активность и завершает свое выполнение? Основных причин может быть 2 (JLS Секция 12.8):

  • Все потоки, которые не являются демонами, выполнены;
  • Какой то из потоков вызывает метод exit() класса Runtime или же класса System и
    SecurityManager дает добро на выполнение exit().

В обоих случаях в процессе завершения работы JVM передает своему родительскому процессу (процессу который запустил JVM) код выхода — значение типа int, на основании которого родительский процесс может делать выводы об успешности или не удачности выполнения поставленных перед JVM задач.

Исходя из общепринятой практики и установленных стандартов код выхода равный 0 — сигнализирует об успешном выполнении задачи.

Именно значение 0 и возвращает JVM в первом, вышеописанном случае при своем завершении.

Как это можно проверить?
Тут нам на помощь приходит параметр командной строки ERRORLEVEL, который позволяет получить код выхода программы, которую мы запускали последней.

Как видим со скриншота код выхода равен 0.

Переходим ко второму случаю, с использованием метода exit().

Какие значения можно передавать в метод exit? Исходя из документации:

The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.


Ага, варианта два: либо 0, либо любое ненулевое значение. Второй вариант можем разбить еще на два под варианта: любое отрицательное число и любое положительное число типа int.

Итак, пробуем вариант с 0:

Как видим, родительский процесс снова получил информацию об успешном завершении JVM.

А что же с nonzero значениями? Что, когда и в каком случае передавать?
Тут все просто — никаких требований для nonzero значений нету и следует руководствоваться лишь одним общим правилом:

  1. Возвращаем код выхода со значением >0 в случае, если мы ожидали что что то может случится нехорошее и оно таки случилось, например: некорректные данные в args[], или не удалось найти какой то важный для работы приложения файл, или не удалось подключиться к серверу и тд.
  2. Возвращаем код выхода со значением Теги:
    • java

    Добавить метки

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

exit – завершение работы программы

#include
void exit (int code);

int code – определяет статус завершения работы, 0 (EXIT_SUCCESS)– нормальное завершение работы, отличное от нуля значение (EXIT_FAILURE) – завершение работы с индикацией ошибки.

Ничего не возвращает.

Функция exit (), завершает работу программы. Аргумент code указывает статус завершения работы. При завершении работы в штатном порядке рекомендуется указывать значение статуса 0 или EXIT_SUCCESS. В противном случае рекомендуется указывать отличное от нуля значение или EXIT_FAILURE.

При вызове функции exit () в начале вызываются все функции зарегистрированные функцией atexit () в порядке обратном регистрации. Если какие то функции были зарегистрированы несколько раз, то они будут вызваны столько раз, сколько раз были зарегистрированы.

Затем сбрасываются и закрываются все открытые программой потоки данных и удаляются все созданные временные файлы (созданные с помощью функции tmpfile()). Затем завершается работы программы.

В примере, организуется бесконечный цикл, в котором анализируются символы, вводимые в стандартный поток ввода-вывода. Как только программа встречает символ ‘e’, она завершает работу, вызывая функцию exit (). В качестве параметра функции указывается статус EXIT_SUCCESS, так как завершение работы штатное.

Dos fn 4ch: завершить программу exit

Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:

+00h: слово — CDh 20h — команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду. Введено для совместимости с командой СР/М CALL 0.

+02h: слово — сегментный адрес первого байта после области памяти, выделенной для программы

+04h: байт — не используется DOS

+05h: 5 байт — 9Ah F0h FEh 1Dh F0h — команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.

+0Ah: 4 байта — адрес обработчика INT 22h (выход из программы)

+0Eh: 4 байта — адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).

+12h: 4 байта — адрес обработчика INT 24h (обработчик критических ошибок)

+16h: слово — сегментный адрес PSP процесса, из которого был запущен текущий.

+18h: 20 байт — JFT — список открытых идентификаторов, один байт на идентификатор, FFh — конец списка.

+2Ch: слово — сегментный адрес копии окружения для процесса.

+2Eh: 2 слова — SS:SP процесса при последнем вызове INT 21h.

+32h: слово — число элементов JFT (по умолчанию 20).

+34h: 4 байта — дальний адрес JFT (по умолчанию PSP:0018).

+38h: 4 байта — дальний адрес предыдущего PSP.

+3Ch: байт — флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.

+3Dh: байт — флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).

+3Eh: слово — не используется в DOS.

+40h: слово — версия DOS, которую вернет функция DOS 30h (DOS 5.0+).

+42h: 12 байт — не используется в DOS.

+50h: 2 байта — CDh 21h — команда INT 21h.

+54h: 7 байт — область для расширения первого FCB.

+5Ch: 16 байт — первый FCB, заполняемый из первого аргумента командной строки.


+6Ch: 16 байт — второй FCB, заполняемый из второго аргумента командной строки.

+7Ch: 4 байта — не используется в DOS.

+80h: 128 байт — командная строка и область DTA по умолчанию.

и записывает программу в память, начиная с адреса PSP:0100h. Если загружается ЕХЕ-программа, использующая дальние процедуры или сегменты данных, DOS модифицирует эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, которые получили эти процедуры и сегменты данных при загрузке программы в память. При запуске СОМ-программы регистры устанавливаются следующим образом:

AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе — 00h.

АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.

CS = DS = ES = SS = сегментный адрес PSP.

SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).

При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).

Все эти действия выполняет одна функция DOS — загрузить и выполнить программу.

Функция DOS 4Bh — Загрузить и выполнить программу

Ввод:АН = 4Bh
AL = 00h — загрузить и выполнить
AL = 01h — загрузить и не выполнять
DS:DX — адрес ASCIZ-строки с полным именем программы
ES:BX — адрес блока параметров ЕРВ:

    +00h: слово — сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
    +02h: 4 байта — адрес командной строки для нового процесса
    +06h: 4 байта — адрес первого FCB для нового процесса
    +0Ah: 4 байта — адрес второго FCB для нового процесса
    +0Eh: 4 байта — здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
    +12h: 4 байта — здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)

AL = 03h — загрузить как оверлей
DS:DX — адрес ASCIZ-строки с полным именем программы
ES:BX — адрес блока параметров:

    +00h: слово — сегментный адрес для загрузки оверлея
    +02h: слово — число, которое будет использовано в командах, использующих непосредственные сегментные адреса, — обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов

AL = 05h — подготовиться к выполнению (DOS 5.0+)
DS:DX — адрес следующей структуры:

    +00h: слово — 00h
    +02h: слово:

      бит 0 — программа — ЕХЕ
      бит 1 — программа — оверлей

    +04h: 4 байта — адрес ASCIZ-строки с именем новой программы
    +08h: слово — сегментный адрес PSP новой программы
    +0Ah: 4 байта — точка входа новой программы
    +0Eh: 4 байта — размер программы, включая PSP
Вывод:CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 — файл не найден, 5 — доступ к файлу запрещен, 8 — не хватает памяти, 0Ah — неправильное окружение, 0Bh — неправильный формат)

Для подфункций 00 и 01 требуется, чтобы было достаточно свободной памяти для загрузки программы, так что СОМ-программы должны воспользоваться функцией DOS 4Ah для уменьшения отведенного им блока памяти до минимально необходимого. При вызове подфункции 03 DOS загружает оверлей в память, выделенную текущим процессом, так что ЕХЕ-програмаш должны убедиться, что ее достаточно.

Эта функция игнорирует расширение файла и различает ЕХЕ- и СОМ-файлы по первым двум байтам заголовка («MZ» для ЕХЕ-файлов).

Подфункция 05 должна вызываться после загрузки и перед передачей управления на программу, причем никакие прерывания DOS и BIOS нельзя вызывать после возвращения из этой подфункции и до перехода на точку входа новой программы.

Загруженной и вызванной таким образом программе предоставляется несколько способов завершения работы. Способ, который чаще всего применяется для СОМ-файлов, — команда RETN. При этом управление передается на адрес PSP:0000, где располагается код команды INT 20h. Соответственно можно завершить программу сразу, вызвав INT 20h, но оба эти способа требуют, чтобы CS содержал сегментный адрес PSP текущего процесса. Кроме того, они не позволяют вернуть код возврата, который может передать предыдущему процессу информацию о том, как завершилась запущенная программа. Рекомендованный способ завершения программы — функция DOS 4Ch.

Функция DOS 4Ch — Завершить программу

Ввод: АН = 4Ch
AL = код возврата

Значение кода возврата можно использовать в пакетных файлах DOS как переменную ERRORLEVEL и определять из программы с помощью функции DOS 4Dh.

Функция DOS 4Dh — Определить код возврата последнего завершившегося процесса

Ввод:АН = 4Dh
Вывод:АН = способ завершения:

    00h — нормальный
    01h — Ctrl-Break
    02h — критическая ошибка
    03h — программа осталась в памяти как резидентная

AL = код возврата
CF = 0

Воспользуемся функциями 4Ah и 4Bh в следующем примере программы, которая ведет себя как командный интерпретатор, хотя на самом деле единственная команда, которую она обрабатывает, — команда exit. Все остальные команды передаются настоящему COMMAND.COM с ключом /С (выполнить команду и вернуться).

Для краткости в этом примере используются функции для работы с обычными короткими именами файлов. Достаточно заменить строку

и увеличить размер буфера для текущего каталога (pwd_buffer) с 64 до 260 байт, чтобы каталоги с длинными именами отображались корректно в подсказке для ввода. Но для совместимости следует также добавить проверку на поддержку функции 71h (LFN) и определить размер буфера для каталога с помощью подфункции LFN A0h.

Dos fn 4ch: завершить программу exit

31H и INT 27H Завершиться, но остаться резидентным

00H и INT 20H традиционный TERMINATE: завершение программы

4cH TERMINATE: Завершиться, передав код выхода родительскому процессу
4dH получить код выхода завершившегося процесса

INT 23H завершение через Ctrl-Break
INT 24H завершение через Обработчик критических ошибок

Запуск и завершение программ
Префикс программного сегмента (PSP)
Структура заголовка файла EXE

Запуск и завершение программ

Ввиду сегментации адресного пространства процессора 8088/86/286 и того факта,
что переходы (JMP) и вызовы (CALL) используют относительную адресацию, оба типа
программ могут выполняться в любом месте памяти. Программы НИКОГДА не пишутся
в предположении, что они будут загружаться с определенного адреса (за исключе-
нием некоторых самозагружающихся, защищенных от копирования игровых программ).

• Файл COM-формата — это двоичный образ кода и данных программы. Такой файл
должен занимать менее 64K и не содержит перемещаемых адресов сегментов.

• Файл EXE-формата содержит специальный заголовок, при помощи которого загруз-
чик выполняет настройку ссылок на сегменты в загруженном модуле.

Перед загрузкой COM- или EXE-программы DOS определяет
сегментный адрес, называемый префиксом программного сегмента
(PSP), как базовый для программы. DOS выбирает при этом наименьший доступный
адрес; другая управляющая программа (скажем, Microsoft Windows) может выбрать
любую часть памяти. Затем DOS выполняет следующие шаги:


1. Создает копию текущего Окружения DOS для программы. Функция DOS 4bH (EXEC)
позволяет родительской программе создать другое окружение. Например, про-
грамма может запустить COMMAND.COM, установив в качестве подсказки DOS
текст «Use EXIT to return to UltraProg>».

2. Помещает путь, откуда загружена программа, в конец окружения. DOS 3.0+

3. Заполняет поля PSP информацией, полезной для загружаемой программы

5. Загружает регистр AX значением, отражающим корректность обозначений дисков
(если есть) в параметрах, введенных в командной строке:

• если AL=0ffH, то первое обозначение диска неверно
• если AH=0ffH, то второе обозначение диска неверно

EXE-программы содержат несколько программных сегментов, вклю-
чая сегмент кода, данных и стека. EXE-файл загружается, начи-
ная с адреса PSP:0100. В процессе загрузки считывается информация заголовка EXE
в начале файла и выполняется перемещение адресов сегментов. Это означает, что
ссылки типа

mov ax,data_seg
mov ds,ax
и
call my_far_proc

должны быть приведены (пересчитаны), чтобы учесть тот факт, что программа была
загружена в произвольно выбранный сегмент. См. заголовок EXE о подробностях
структуры заголовка и процесса перемещения.

После перемещения управление передается загрузочному модулю посредством инструк-
ции далекого перехода (FAR JMP) к адресу CS:IP, извлеченному из заголовка EXE.

В момент получения управления программой EXE-формата:

• DS и ES указывают на PSP
• CS, IP, SS и SP инициализированы значениями, указанными в заголовке EXE
• поле PSP MemTop содержит значение, указанное в заголовке EXE. Обычно вся
доступная память распределена программе.

COM-программы содержат единственный сегмент (или, во всяком
случае, не содержат явных ссылок на другие сегменты). Образ
COM-файла считывается с диска и помещается в память, начиная с PSP:0100. Заме-
тим, что COM-программа может использовать множественные сегменты, но она должна
сама вычислять сегментные адреса, используя PSP как базу.

COM-программы предпочтительнее EXE-программ, когда дело касается небольших
ассемблерных утилит. Они быстрее загружаются, ибо не требуется перемещения сег-
сентов, и занимают меньше места на диске, поскольку заголовок EXE и сегмент
стека отсутствуют в загрузочном модуле.

После загрузки двоичного образа:

• CS, DS, ES и SS указывают на PSP
• SP указывает на конец сегмента PSP (обычно 0fffeH, но может быть и меньше,
если полный 64K сегмент недоступен). Слово по смещению 06H в PSP указывает,
какая часть программного сегмента доступна.
• Вся память системы за программным сегментом распределена программе.
• Слово 00H помещено (PUSH) в стек.
• IP содержит 100H (первый байт модуля) в результате команды JMP PSP:100

Одно время (в эпоху DOS 1.1), описание схемы выхода из
программы, которую изобрел для DOS Rube Goldberg, зани-
мало несколько страниц. Начиная с DOS 2.0, жить стало легче. Вы можете выйти:

• через функцию 4cH (EXIT) в любой момент, независимо от значений регистров.
• через функцию 00H или прерывание INT 20H , когда ваш CS указывает на PSP.

До версии DOS 2.0, вы должны были сохранять сегмент PSP при запуске. Затем,
чтобы выйти, вам приходилось помещать этот сегмент в стек, далее помещать в
стек слово 00H, и наконец выполнять FAR RET. Это передавало управление на
адрес PSP:0000, содержащий код прерывания INT 20H. Эта процедура гарантировала,
что регистр CS устанавливался таким, каким его ожидала DOS.

Функция DOS 4cH устраняет эти сложности и позволяет вам возвращать родительскому
процессу (обычно COMMAND.COM) код выхода , который может быть проверен вызываю-
щей программой или командой COMMAND.COM «IF ERRORLEVEL».

Вы можете также завершить программу и оставить ее постоянно резидентной (TSR),
используя либо INT 27H , либо функцию DOS 31H (KEEP). Последний способ имеет
те преимущества, что резидентный код может быть длиннее 64K, и что вы можете
сформировать код выхода для родительского процесса.

TSR-программы удобны при установке пользовательских заплат для DOS и BIOS.
Эта концепция используется popup-утилитами, такими как SideKick и ваш покорный
слуга TECH Help! (если называть наиболее важные примеры).

Следующие пункты имеют отношение к рассматриваемой теме:

Функции управления процессами индекс функций запуска и завершения
Префикс программного сегмента детальная структура PSP
DOS Fn 26H . построить PSP
DOS Fn 4bH (EXEC). загрузить и выполнить программу
DOS Fn 62H . получить значение PSP для текущей программы
DOS Fn 2fH . получить текущий DTA
Окружение DOS . определить диск и оглавление, из которых
загружена текущая программа

DOS Fn 4bH: Выполнить или загрузить программу — EXEC
Вход AH 4bH
DS:DX адрес строки ASCIIZ с именем файла, содержащего программу
ES:BX адрес EPB (EXEC Parameter Block — блока параметров EXEC)
AL 0 = Загрузить и выполнить
AL 3 = Загрузить программный оверлей
Выход AX код ошибки если CF установлен

DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0.
Если диск или путь опущены, они подразумеваются по умолчанию.
ES:BX указывает на блок памяти, подготовленный как EPB, формат
которого зависит от запрошенной подфункции в AL.

1. Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному объему
памяти, требуемой вашей программе (в параграфах).
2. Подготовьте строку ASCIIZ с именем вызываемого программного фай-
ла и установите DS:DX на первый символ этой строки.
3. Подготовьте Блок Параметров EXEC со всеми необходимыми полями.
4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных,
адресуемых через регистр CS (CS — это единственная точка для
ссылок после того, как EXEC вернет управление от ребенка).
5. Выдайте вызов EXEC с AL=0.
6. Восстановите локальные значения SS и SP.
7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.
8. Восстановите DS, ES и локальную DTA, если необходимо.
9. Проверьте код выхода через функцию 4dH WAIT (если надо).

Все открытые файлы дублируются, так что ребенок может обрабатывать
данные как через описатели файлов, так и через стандартный в/в.
Режимы доступа описателей дублируются, но любые активные блокировки
файлов не будут относиться к ребенку. См. функцию 5cH.

После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-
Break и INT 24H Critical Error восстанавливаются в их предыдущие
значения.

Вместо разбора собственных FCB (как требуется для EPB), вы можете
найти удобным загрузить и выполнить вторичную копию файла
COMMAND.COM, используя опцию /C. Например, чтобы выполнить
программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ:
«\command.com»,0
и установите EPB+2 на сегмент и смещение следующей строки команд:
0eH,»/c format a:/s/4″,0dH

Такой вторичный интерпретатор команд использует очень мало памяти
(около 4K). Вы можете поискать в Окружении DOS строку COMSPEC=,
чтобы установить точное местоположение файла COMMAND.COM.

См.также: Функции управления процессами Запуск и завершение Функции DOS

DOS Fn 62H: Дать адрес PSP
Вход AH 62H DOS 3.0+
Выход BX сегментный адрес PSP выполняющейся программы

Описание: Эта функция возвращает в BX адрес PSP текущей программы.

Используется, чтобы получить адрес параметров командной строки,
адрес окружения DOS и другой полезной информации в PSP.

Версии: Доступна, начиная с DOS 3.0

DOS Fn 26H: Построить PSP
Вход AH 26H
DX адрес сегмента (параграфа) для нового PSP
CS сегмент PSP, используемого как шаблон для нового PSP
Выход Нет

См.также: PSP (Program Segment Prefix) Окружение DOS Функции DOS

Структура заголовка файла EXE

Поскольку EXE-файл может быть загружен в любой сегмент, все абсолютные сегмент-
ные ссылки (FAR CALL, далекие указатели, ссылки типа MOV AX,data_seg) должны
быть приведены к адресам памяти, соответствующим загрузке. Ниже приведены шаги,
используемые программой загрузки DOS (функция 4bH ) при загрузке файла EXE:

1. создать PSP посредством функции DOS 26H

2. прочитать 1cH байт файла EXE (форматированную порцию заголовка EXE)
в локальную область памяти

3. определить размер модуля = ( (PageCnt*512)-(HdrSize*16) ) — PartPag

4. определить файловое смещение загружаемого модуля = (HdrSize * 16)

5. выбрать сегментный адрес, START_SEG, для загрузки (обычно PSP + 10H)

6. считать модуль в область памяти, начинающуюся с адреса START_SEG:0000

7. LSEEK (уст. указатель файла) на начало таблицы перемещения (TablOff)

8. для каждого элемента перемещения (ReloCnt):

9. Распределить память для программы согласно MaxMem и MinMem

10. Инициализировать регистры и запустить программу:

Замечание: Последние добавления в формат EXE, особенно версии EXE-файлов
«CodeView» и «Windows», содержат дополнительную информацию, включенную в
выполнимый файл. Эти добавления не отражены в этой версии TECH Help!.

Илон Маск рекомендует:  Описание объекта response
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL