Dos fn 4bh выполнить или загрузить программу exec


DOS, функция 4Bh Выполнить или загрузить программу

DS:DX — адрес строки ASCIZ с именем файла, содержащего программу

ES:BX — адрес ЕРВ (блока параметров ЕХЕС)

AL=°OOh — загрузить и выполнить

AL=01h — загрузить, но не выполнять

AL=03h — загрузить программный оверлей

CF=0, если функция выполнена успешно

ВХ, DX не сохранены

СЕ=1, если при выполнении функции возникли ошибки

Данная функция загружает в память и запускает программу, имя кото-

рой указано в регистрах DS:DX. Запущенная программа после заверше-

ния работы возвратит управление запускаемой. Если диск или путь

не указаны, принимаются значения по умолчанию. ES:BX указывает

на блок памяти, подготовленный как ЕРВ, формат которого зависит

MS-DOS для программиста

3.4. Запуск программ из программ

Ваша программа может при необходимости запустить другую exe- или com-программу.

Программа, составленная на языке ассемблера, запускает другую программу с помощью функции 4Bh прерывания INT 21h . Для выполнения той же задачи из программ, составленных на языке С, следует использовать разнообразные функции, входящие в состав стандартной библиотеки системы разработки.

Сначала рассмотрим процедуру запуска программы при помощи функции 4Bh прерывания INT 21h .

Перед вызовом прерывания вы должны загрузить регистры процессора следующим образом:

Регистр Содержимое
AH 4Bh
AL Код подфункции (0, 1, 2, 3, 5)
DS:DX Указатель на текстовую строку в формате ASCIIZ , содержащую путь к запускаемой программе
ES:BX Указатель на блок параметров EPB

После возврата из прерывания флаг переноса CF устанавливается в 0, если ошибок не было, и в 1 — при обнаружении ошибок. Если произошла ошибка, ее код записывается в регистр AX:

Код ошибки Описание
1 Неверный код подфункции
2 Не найден файл запускаемой программы
3 Указанный путь не найден
4 Слишком много открытых файлов
5 Нет доступа
8 Нет памяти для загрузки программы
10 Длина блока среды больше 32 Кбайт
11 Неправильный формат запускаемого exe-файла

Функция 4Bh прерывания INT 21h имеет несколько подфункций:

Код Описание
Загрузить и выполнить программу
1 Загрузить, но не выполнять программу
2 Загрузить, но не выполнять программу (недокументированная подфункция)
3 Загрузить программу как оверлей (не создавая при этом блок PSP )
5 Подготовить программу для выполнения

Опишем эти подфункции более подробно.

Загрузка и выполнение программы

Для функции 0 регистры DS:DX должны указывать на полный путь запускаемой программы в формате ASCIIZ (т. е. на текстовую строку, закрытую двоичным нулем). Блок параметров EPB (Exec Parameter Block ) в этом случае имеет следующий формат:

Смещение, байт Размер, байт Имя поля Описание
2 seg_env Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
2 4 cmd Дальний адрес строки параметров для запускаемой программы. Эта строка должна иметь такой же формат, как и в PSP , т. е. в начале строки находится байт со значением, равным количеству символов в строке параметров, а затем — сама строка параметров
6 4 fcb1 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch
10 4 fcb2 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch

Запущенной программе доступны все файлы, открытые родительской программой.

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

Для примера приведем исходный текст простой программы SPARM (листинг 3.5), которая запускает программу с именем parm.com из текущего каталога. Программу parm.com мы уже рассматривали (листинг 3.2). Эта программа выводит на экран параметры, полученные ей при запуске через командную строку.

Листинг 3.5. Файл sparm\sparm.asm

Программа SPARM освобождает всю неиспользуемую ей память, после чего на освободившееся место загружает программу parm.com. Такая процедура необходима потому, что MS-DOS выделяет всю имеющуюся память в распоряжение запускаемой com-программы. Поэтому при попытке запустить программу без предварительного освобождения части памяти функция 4Bh вернет код ошибки 8 (нет памяти для загрузки программы).

Для изменения размера блока памяти, выделенного программе, мы использовали функцию 4Ah прерывания INT 21h .

Загрузка программы без выполнения

Подфункции 1 и 2 прерывания INT 4Bh используются операционной системой MS-DOS для собственных нужд (это внутренние подфункции MS-DOS). Они также необходимы для создания программ-отладчиков, таких как, например, debug.com или td.exe. Мы приведем недокументированный формат блока EBP для этих функций.

Для подфункции 1 блок EBP имеет следующий формат:

Смещение, байт Размер, байт Имя поля Описание
2 seg_env Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
2 4 cmd Дальний адрес строки параметров для запускаемой программы
6 4 fcb1 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch
10 4 fcb2 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch
14 4 ss_sp В это поле после завершения работы запускаемой программы будет записано содержимое регистров SS:SP
18 4 entry_p Адрес точки входа в загруженную программу, который нужно записать в регистры CS:IP при запуске программы

Формат блока EPB для подфункции 2:

Смещение, байт Размер, байт Имя поля Описание
2 seg_env Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
2 4 cmd Дальний адрес строки параметров для запускаемой программы
6 4 fcb1 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch
10 4 fcb2 Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch

Загрузка программного оверлея

Подфункция 3 используется для загрузки программных оверлеев . Оверлей загружается в адресное пространство родительской программы, поэтому MS-DOS не заказывает дополнительной памяти и не строит PSP . Формат EPB для этой подфункции:

Смещение, байт Размер, байт Имя поля Описание
2 seg_env Сегментный адрес, по которому загружается программа
2 4 reloc Фактор перемещения. Для exe-программ обычно содержит то же значение, что и поле seg_env, для com-программ в этом поле находится значение 0

Следующий фрагмент программы загружает программу parm.com как оверлей без передачи ей управления (программа загружается в буфер buff):

Подготовка программы для выполнения

Подфункция 5 используется для загрузки и предварительной подготовки программы к выполнению . Она впервые появилась в MS-DOS версии 5.0. Вы можете использовать ее вместо недокументированных подфункций 1 и 2.

Если программа, запущенная с помощью подфункции 5, попытается определить версию MS-DOS, ей будет предоставлен не истинный номер версии, а определенный с учетом действия драйвера setver.

Напомним, что с помощью драйвера setver MS-DOS может «обмануть» программу, сообщив ей, что работает MS-DOS, например, версии 3.31 или любой другой версии, указанной пользователем. Такая возможность требуется в тех случаях, когда программа была рассчитана на конкретную версию MS-DOS, но, тем не менее, способна работать и в новой версии.

Для подфункции 5 указатель, расположенный в регистрах DS:DX, должен указывать на структуру EXECSTATE, описанную ниже:

Смещение, байт Размер, байт Имя поля Описание
2 Reserved Зарезервировано
2 2 Flags Тип программы: 0 — com-программа, 1 — exe-программа, 2 — оверлей
4 4 ProgName Указатель на текстовую строку ASCIIZ , содержащую имя программы
8 2 PSP Сегмент блока PSP новой программы
10 4 StartAddr Стартовый адрес CS:IP новой программы
14 4 ProgSize Общий размер программы с учетом размера блока PSP

Запуск программ из программ, составленных на языке С

Пользователи языка С имеют в своем распоряжении несколько возможностей запустить программу.

Самый простой способ — использовать функцию system . Эта функция может выполнить любую команду MS-DOS или любую программу, а также пакетный файл. Например:

При использовании этой функции должен быть доступен файл command.com .

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

Код возврата в этом случае будет 0 — как будто все хорошо!

Другая возможности запустить программу — использовать функции spawn и exec.

Функция spawn и ее разновидности запускают программу как дочерний процесс. Функция exec загружает новую программу как оверлей на место старой и передает ей управление без возврата. После завершения дочерней программы управление будет передано программе command.com или программе, которая запустила родительскую программу.

Семейство функций spawn обеспечивает запуск дочерней программы, передавая ей родительскую или с специально сформированную среду. Кроме того, в файле process.h описаны параметры, которые можно передать функции spawn:

Параметр Описание
P_WAIT Выполнение родительской программы задерживается до завершения дочерней программы
P_NOWAIT Родительская программа продолжает выполнение сразу после запуска дочерней программы. Этот параметр имеет смысл только для мультизадачных операционных систем
P_OVERLAY Загружает программу как оверлей и передает ей управление. Этот режим соответствует функции exec в том смысле, что родительская программа не получит управления после завершения дочерней

Ниже мы привели исходный текст программы SPARM1 (листинг 3.6), которая запускает программу parm.com с помощью функции spawnlpe. Эта функция входит в стандартную библиотеку Borland C++ и позволяет не только запустить программу, но и сформировать для нее среду, а также передать параметры.

Листинг 3.6. Файл sparm1\sparm1.cpp

3. Управление программами

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

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

COM-файл — это двоичный образ Вашей программы, состоящий из кода и данных. То есть это файл, содержащий программу в «чистом» виде. Такая программа (как и EXE-программа) может загружаться в любое место памяти. DOS выполняет ее привязку к физическим адресам при загрузке с помощью установки сегментных регистров. Существенным ограничением COM-программы является то, что она не может занимать больше одного сегмента (соответственно, файл .COM не может быть по длине больше 64К).

Программа в формате EXE может иметь любой размер. В самом начале файла программы содержится заголовок (у COM-файла заголовка нет). Этот заголовок используется операционной системой в процессе загрузки программы в память для правильной установки сегментных регистров. Заголовок EXE-файла нужен только при загрузке; когда программа загружена и готова к работе, самого заголовка уже нет в памяти.

Заголовок EXE-файла состоит из форматированной зоны и таблицы расположения сегментов (Relocation Table). Форматированная зона выглядит следующим образом:

(0) 2 signature два байта ‘MZ’ (4Dh, 5Ah), индентифицирующие файл в формате EXE
(+2) 2 part_pag длина последней страницы программы в байтах (страница содержит 512 байт)
(+4) 2 file_size размер программы в страницах по 512 байт
(+6) 2 rel_item число элементов в таблице расположения сегментов
(+8) 2 hdr_size размер заголовка файла в параграфах (длина параграфа — 16 байт)
(+10) 2 min_mem минимальное количество памяти в параграфах, которое нужно зарезервировать в памяти за концом загруженной программы
(+12) 2 max_mem максимальное количество памяти в параграфах, которое нужно зарезервировать в памяти за концом загруженной программы
(+14) 2 ss_reg величина смещения от начала программы, которая используется для загрузки сегментного регистра стека SS
(+16) 2 sp_reg величина смещения от начала программы, которая используется для загрузки регистра SP
(+18) 2 chk_summ контрольная сумма всех слов в файле
(+20) 2 ip_reg значение для регистра IP, которое будет использовано при начальном запуске программы
(+22) 2 cs_reg смещение от начала программы для установки сегментного регистра кода CS
(+24) 2 relt_off смещение от начала файла таблицы расположения сегментов программы
(+26) 2 overlay номер оверлея, равен 0 для основного модуля

Таблица расположения сегментов программы начинается сразу после форматированной области и состоит из четырехбайтовых значений в формате «смещение:сегмент».

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

В файле sysp.h есть описание заголовка файла и таблицы расположения сегментов, которые вы можете использовать при обработке заголовка EXE-файла:

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

Приведенная выше программа для чтения заголовка EXE-файла пользуется функцией get-exeh:

Загрузка COM- и EXE-программ происходит по-разному, однако есть некоторые действия, которые операционная система выполняет в обоих случаях одинаково.

  • Определяется наименьший сегментный адрес свободного участка памяти для загрузки программы (обычно DOS загружает программу в младшие адреса памяти, если при редактировании не указана загрузка в старшие адреса).
  • Создаются два блока памяти (и, следовательно, два блока MCB, описанные ранее) — блок памяти для переменных среды и блок памяти для PSP и программы.
  • Для DOS версии 3.х и старше в блок памяти переменных среды помещается путь файла программы.
  • Заполняются поля префикса сегмента программы PSP в соответствии с характеристиками программы (количество памяти, доступное программе, адрес сегмента блока памяти, содержащего переменные среды и т.д.)
  • Устанавливается адрес области Disk Transfer Area (DTA) на вторую половину PSP (PSP:0080).
  • Анализируются параметры запуска программы на предмет наличия в первых двух параметрах идентификаторов дисковых устройств. По результатам анализа устанавливается содержимое регистра AX при входе в программу. Если первый или второй параметры не содержат правильного идентификатора дискового устройства, то соответственно в регистры AL и AH записывается значение FF.

А дальше действия системы по загрузке программ форматов COM и EXE будут различаться.

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

После загрузки файла операционная система для COM-программ выполняет следующие действия:

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

указатель команд IP устанавливается на 100h (начало программы) с помощью команды JMP по адресу PSP:100.

Загрузка EXE-программ происходит значительно сложнее, так как связана с настройкой сегментных адресов:

  • Считывается во внутренний буфер DOS форматированная часть заголовка файла.
  • Определяется размер загрузочного модуля по формуле:

  • Определяется смещение начала загрузочного модуля в EXE-файле как hdr_size*16.
  • Вычисляется сегментный адрес для загрузки START_SEG, обычно используется значение PSP+10h.
  • Загрузочный модуль считывается в память по адресу START_SEG:0000.
  • Сканируются элементы таблицы перемещений, располагающейся в EXE-файле со смещением relt_off.
  • Для каждого элемента таблицы:


1. Считывается содержимое элемента таблицы как два двухбайтных слова (OFF,SEG).

2. Вычисляется сегментный адрес ссылки перемещения

3. Выбирается слово по адресу REL_SEG:OFF, к этому слову прибавляется значение START_SEG, затем сумма записывается обратно по тому же адресу.

  • Заказывается память для программы, исходя из значений min_mem и max_mem.
  • Инициализируются регистры, и программа запускается на выполнение.

При инициализации регистры ES и DS устанавливаются на PSP, регистр AX устанавливается так же, как и для COM-программ, в сегментный регистр стека SS записывается значение START_SEG + ss_reg, а в SP записывается sp_reg.

Для запуска программы в CS записывается START_SEG+cs_reg, а в IP — ip_reg. Такая запись невозможна напрямую, поэтому операционная система сначала записывает в свой стек значение для CS, затем значение для IP и после этого выполняет команду дальнего возврата RETF (команда возврата из дальней процедуры).

Теперь займемся вплотную префиксом программного сегмента PSP. Формат PSP уже был описан ранее, для удобства приведем его еще раз вместе со структурой из файла sysp.h:

(0) 2 int 20h двоичный код команды int 20h (программы могут использовать эту команду для завершения своей работы)
(+2) 2 mem_top нижняя граница доступной памяти в системе в параграфах
(+4) 1 reserv1 зарезервировано
(+5) 5 call_dsp команда вызова FAR CALL диспетчера MS-DOS
(+10) 4 term_adr адрес завершения (Terminate Address)
(+14) 4 cbrk_adr адрес обработчика Ctrl-Break
(+18) 4 crit_err адрес обработчика критической ошибки
(+22) 2 parn_psp сегмент PSP программы, запустившей данную программу (программы-родителя)
(+24) 20 file_tab таблица открытых файлов, если здесь находятся байты 0FFH, то таблица не используется
(+44) 2 env_seg сегмент блока памяти, содержащего переменные среды
(+46) 4 ss_sp адрес стека SS:SP программы
(+50) 2 max_open максимальное число открытых файлов
(+52) 4 file_tba адрес таблицы открытых файлов
(+56) 24 reserv2 зарезервировано
(+80) 3 disp диспетчер функций DOS
(+83) 9 reserv3 зарезервировано
(+92) 16 fcb1 форматируется как стандартный FCB, если первый аргумент командной строки содержит правильное имя файла
(+108) 20 fcb2 заполняется для второго аргумента командной строки аналогично fcb1
(+128) 1 p_size число значащих символов в неформатированной области параметров, либо буфер обмена с диском DTA, назначенный по умолчанию
(+129) 127 parm неформатированная область параметров, заполняется при запуске программы из командной строки

Программы могут получить из PSP такую информацию, как параметры командной строки при запуске, размер доступной памяти, найти сегмент области переменных среды и т.д.

Как программе узнать адрес своего PSP? Очень просто сделать это для программ, написанных на языке ассемблера: при запуске программы этот адрес передается ей через регистры DS и ES. То есть этот адрес равен DS:0000 или ES:0000 (для COM-программ на PSP указывают также регистры CS и SS).

Для программ, составленных на языке Си, доступна глобальная переменная _psp типа unsigned. Эта переменная содержит сегментный адрес PSP.

В качестве примера приведем текст программы на языке ассемблера, которая выводит на экран передаваемые ей через PSP параметры запуска:

Приведенная ниже программа, составленная на языке Си, определяет адрес своего PSP, затем показывает содержимое некоторых полей из PSP:

Используя поле parn_psp, можно определить адрес PSP родительской программы, то есть программы, запустившей Вашу программу.

Немного о назначении полей term_adr, cbrk_adr, crit_err.

Поле term_adr содержит значение, полученное из таблицы векторов прерываний для вектора 22h. Это адрес программы, которая получает управление, когда текущая программа завершает свою работу. Это может быть, например, COMMAND.COM. Программа может создать свою собственную подпрограмму, которая будет получать управление при завершении работы основной программы. Она может записать свой собственный адрес в вектор 22h, затем запустить другую программу. В таком случае в запущенной программе это поле в ее PSP будет содержать адрес родительской программы. Когда основная программа завершает свою работу, DOS восстанавливает адрес программы завершения в векторе 22h из поля term_adr PSP.

Поле cbrk_adr содержит адрес программы обработки прерывания по нажатию Ctrl-Break из вектора 23h таблицы векторов прерываний. Так как программа может устанавливать свою собственную программу обработки прерывания по Ctrl-Break, DOS при завершении работы программы восстанавливает оригинальное значение из поля cbrk_adr.

Аналогично поле crit_err предназначено для восстановления содержимого вектора 24h — адреса обработчика критических ошибок.

Способы переназначения векторов будут приведены в разделе, посвященном прерываниям.

Конечно, программы, составленные на языке Си, не обязательно должны использовать PSP для доступа к параметрам командной строки и переменным среды. Для этого есть параметры функции main и набор функций типа getenv, putenv и т.п., предназначенных для работы со средой. Но ведь PSP содержит и другую информацию!

Ваша программа может при необходимости запустить другую программу формата EXE или COM. Для ассемблерных программ существует функция 4Bh прерывания INT 21h, для программ, составленных на языке Си — разнообразные функции, входящие в состав стандартной библиотеки. Сначала рассмотрим запуск программ при помощи функции 4Bh прерывания INT 21h.

Содержимое регистров перед вызовом прерывания:

После возврата из прерывания флаг CF устанавливается в 0, если ошибок не было, и в 1 при обнаружении ошибок. Регистр AX в случае наличия ошибок содержит код ошибки:

1 неверный код подфункции;
2 файл запускаемой программы не найден;
3 путь не найден;
4 слишком много открытых файлов;
5 нет доступа;
8 нет памяти для загрузки программы;
10 длина блока среды больше 32 килобайт;
11 плохой формат запускаемого EXE-файла.

Функция 4Bh прерывания 21h имеет четыре подфункции с номерами от 0 до 3:

загрузить и выполнить программу;
1 загрузить, но не выполнять программу (внутренняя подфункция для DOS 3.х);
2 загрузить, но не выполнять программу (внутренняя подфункция для DOS 2.х);
3 загрузить программу как оверлей (не создавать PSP).

Для функции 0 регистры DS:DX должны указывать на полный путь запускаемой программы в формате ASCIIZ ( т.е. текстовая строка, закрытая двоичным нулем). Блок параметров EPB (Exec Parameter Block) в этом случае имеет следующий формат:

(0) 2 seg_env сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
(+2) 4 cmd FAR-адрес строки параметров для запускаемой программы. Эта строка должна иметь такой же формат, как и в PSP, т.е. вначале идет байт со значением, равным количеству символов в строке параметров, а затем — сама строка параметров
(+6) 4 fcb1 адрес блока FCB, который будет помещен в PSP со смещением 5Ch (в PSP помещается блок, а не адрес!)
(+10) 4 fcb2 адрес блока FCB, который будет помещен в PSP со смещением 6Ch.

Запущенной программе доступны все файлы, открытые родительской программой.

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

Приведем простую программу, которая запускает программу с именем PARM.COM из текущего каталога. Программу PARM.COM мы только что рассматривали, эта программа выводит на экран полученные ей в командной строке параметры.

Эта программа использует модель памяти SMALL, и ее загрузочный модуль имеет формат EXE. При редактировании был указан стандартный для Quick C 2.01 размер памяти, требуемый для программы. Если попытаться использовать формат COM в модели TINY, то окажется, что вся память распределена COM-программе и для дочерней программы не осталось места.

Следующая программа освобождает всю неиспользуемую ей память, после чего на освободившееся место загружает программу PARM.COM:

Для изменения размера выделенного программе блока памяти мы использовали функцию 4Ah прерывания 21h.

Подфункции 1 и 2 прерывания 4Bh используются DOS (это внутренние подфункции DOS). Мы приведем недокументированный формат блока EBP для этих функций.

Для подфункнкции 1:

(0) 2 seg_env сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
(+2) 4 cmd FAR-адрес строки параметров для запускаемой программы.
(+6) 4 fcb1 адрес блока FCB, который будет помещен в PSP со смещением 5Ch
(+10) 4 fcb2 адрес блока FCB, который будет помещен в PSP со смещением 6Ch.
(+14) 4 ss_sp это поле будет содержать значение SS:SP после возврата
(+18) 4 entry_p адрес точки входа в загруженную программу (CS:IP)

Для подфункции 2:

(0) 2 seg_env сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
(+2) 4 cmd FAR-адрес строки параметров для запускаемой программы.
(+6) 4 fcb1 адрес блока FCB, который будет помещен в PSP со смещением 5Ch
(+10) 4 fcb2 адрес блока FCB, который будет помещен в PSP со смещением 6Ch.

Подфункция 3 используется для загрузки программных оверлеев. Оверлей загружается в адресное пространство родительской программы, поэтому DOS не заказывает дополнительной памяти и не строит PSP. Формат EPB для этой подфункции:

(0) 2 seg_env сегментный адрес, по которому загружается программа
(+2) 4 reloc фактор перемещения, аналогичен элементу таблицы перемещений в заголовке EXE-файла

Следующая демонстрационная программа загружает программу PARM.COM_как оверлей без передачи ей управления:

Программа загружается в буфер buff.

Пользователи языка Си имеют в своем распоряжении три возможности запустить программу.

Самый простой способ — использовать функцию system(). Эта функция может выполнить любую команду DOS или любую программу, пакетный файл. Например:

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

Код возврата в этом случае будет 0 — как будто все нормально!

Другие две возможности запустить программу — использовать функции spawn и exec. Функция spawn и ее разновидности запускают программу как дочерний процесс. Функция exec загружает новую программу как оверлей на место старой и передает ей управление без возврата. После завершения дочерней программе управление будет передано COMMAND.COM или программе, которая запустила родительскую программу.

Семейство функций spawn обеспечивает запуск дочерней программы с родительской или со специально сформированной средой. Кроме того, в файле process.h описаны параметры, которые можно передать функции spawn:

P_WAIT выполнение родительской программы задерживается до завершения дочерней программы.
P_NOWAIT родительская программа продолжает выполнение сразу после запуска дочерней. Этот параметр имеет смысл только для операционных систем OS/2, UNIX, в которых поддерживается мультизадачность.
P_OVERLAY загружает программу как оверлей и передает ей управление. Этот режим соответствует функции exec в том смысле, что родительская программа не получит управления после завершения дочерней.

В качестве примера использования функций запуска программы рассмотрим возможное решение проблемы создания HELP-системы для прикладной программы.

С помощью текстового редактора можно создать справочную базу данных в формате утилиты Microsoft HELPMAKE, затем, запуская в нужный момент диалоговую утилиту работы с базой данных Microsoft Quick Help QH.EXE, можно получить нужную справку.

Утилита QH использует базы данных, описанные в переменной среды HELPFILES. Мы будем использовать либо родительскую среду, где находится значение переменной HELPFILES по умолчанию, либо указывать новое значение для этой переменной.

Приведенная ниже программа используется для получения справки о функции стандартной библиотеки printf, поиск производится в HELP-базе QuickC:

Подробная информация об использовании утилит HELPMAKE и QH приводится в документации на Microsoft C 6.0.

Старые версии DOS (до 2.0) требовали выполнения достаточно сложной процедуры для завершения программы. В начале работы программы необходимо было сохранить адрес PSP, затем, перед завершением работы поместить этот адрес в стек, поместить туда же слово 0000 и выполнить команду дальнего возврата. Управление при этом передается в начало PSP, где находится команда INT 20h.

Для версий DOS, начиная с 2.0, существуют более удобные способы — использование напрямую команды INT 20h или функции 0 прерывания 21h (CS при этом должен указывать на PSP, поэтому этот способ хорош для COM-программ), или функции 4Ch прерывания 21h в любое время и с любым содержимым регистров.

Последний способ рекомендуется для использования и имеет еще то преимущество, что позволяет передать родительской программе (например, COMMAND.COM) код завершения. Этот код доступен для анализа в пакетных файлах командой IF ERRORLEVEL.

Приведенные в книге примеры программ на языке ассемблера содержат директиву .EXIT. Эта директива завершает выполнение программы с помощью функции 4Ch и позволяет передать код завершения.

Если Ваша программа запустила дочернюю программу и та завершилась с передачей кода возврата, то родительская программа может определить этот код с помощью функции 4Dh прерывания 21h. Эта функция возвращает код в регистре AX.

Программа, написанная на языке Си, может завершаться с помощью return в функции main или с помощью exit в любом месте программы. При этом также возможна передача кода возврата.

Существуют еще способы завершения работы программы, при которых программа (или ее часть) остается резидентной в памяти. Это вызов прерывания INT 27H или функции 31h прерывания INT 21h. Об этом будет подробно рассказано в разделе, посвященном резидентным программам.

Dos fn 4bh: выполнить или загрузить программу exec

Выпуск № 231
от 06.09.2005, 22:00

Администратор: Калашников О.А.
В рассылке: Подписчиков: 257, Экспертов: 22
В номере: Вопросов: 3, Ответов: 8

Вопрос № 25635: ПРивет многоуважаемые эксперты . У меня почему-то не работает одна процедура она должна сохранять нулевую видео страницу переносом в первую видео страницу. ПООМООГИИТЕЕЕ. Ничего немогу понять. Первая процедура Save_Screen переноси. Вопрос № 25638: Уважаемые экперты! Скажите пожалуйста, как на ASM-е работать с CD-ROM (и подобными до DVD-RW), а именно: 1. Узнать буквы у имеющихся CD-ROM; 2. Проверить наличие компакт диска в приводе; 3. Как считать информацию с диска (файла, дорож. Вопрос № 25639: 1. CSEG segment assume CS:CSEG, DS:CSEG, SS:CSEG org 100h BEGIN: MOV AH, 86h MOV DX,1388h ; задержка 5 секунд INT 15h ; проблема такая: задержка не работает, устанавливается флаг CF в 1, т.е. системный.

Вопрос № 25.635
ПРивет многоуважаемые эксперты .
У меня почему-то не работает одна процедура она должна сохранять нулевую видео страницу переносом в первую видео страницу.
ПООМООГИИТЕЕЕ.
Ничего немогу понять.
Первая процедура Save_Screen переносит байты из 0 страницы в 1 а вторая процедура Restor_Screen обратно последняя возвращяет белеберду какую-то.
Приложение прилагается.
Конечно алгоритм ни ахти какой но всё-же .

Приложение:

Отправлен: 01.09.2005, 07:55
Вопрос задал: PRiSon (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Sager
Здравствуйте, PRiSon!
Адрес первой видеостраницы не 0D800h, а 0В900h. Дальше, ты забыл поставить префикс rep перед movsw, в cx ты ложишь 4000, а надо 2000, так как команда movsw сразу передает по два байта — 2000*2=4000
Вроде все, должно работать.
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 01.09.2005, 08:59
Отвечает: Калашников О.А.
Здравствуйте, PRiSon!
Используйте префикс REP вместе с MOVSW.
Подробней об этом префиксе и командах работы со строками читайте тут:
http://kalashnikoff.ru/Assembler/issues/012.htm

Оптимальный пример копирования экрана можно найти тут:
http://kalashnikoff.ru/Assembler/issues/encl/028/DISPLAY.asm.htm
———
Всё отлично.
Ответ отправил: Калашников О.А. (статус: *Админ)
Отправлен: 01.09.2005, 10:35
Оценка за ответ: 5
Комментарий оценки:
Спасибо !!
Я понимаю что у ВАС самый Оптимальный Вариант но понимаете я хочу сам написать сам помыслить так сказать логитмы и тогдалее.
Отвечает: newinfo2005
Здравствуйте, PRiSon!
Так все нормально,но у тебя всего 3 ошибки.
1.0 стр-ob800h 1 стр-0b900h и т.д.
2.вместо movsw надо rep movsw
3.и в cx надо загрузить 2000 а не 4000 так как ты загружаешь слово а не байт.

———
Хочу стать умным и. много денег и халявного инета.

Ответ отправил: newinfo2005 (статус: 5-ый класс)
Отправлен: 01.09.2005, 13:15
Вопрос № 25.638
Уважаемые экперты!
Скажите пожалуйста, как на ASM-е работать с CD-ROM (и подобными до DVD-RW), а именно:
1. Узнать буквы у имеющихся CD-ROM;
2. Проверить наличие компакт диска в приводе;
3. Как считать информацию с диска (файла, дорожки)
Желательно с исходниками =)
Отправлен: 01.09.2005, 09:21
Вопрос задал: Акулов Андрей Сергеевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Евгений Иванов
Здравствуйте, Акулов Андрей Сергеевич!
для этого используй ASPI.

———
Что имеем — не храним, потерявши — плачем

Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 01.09.2005, 14:53
Отвечает: Стас
Здравствуйте, Акулов Андрей Сергеевич!
Опять — ГДЕ? В Win32? В DOS?

К примеру в DOS это можно сделать прямым программированием IDE и (если установлен) через драйвер CD-ROM.

Ответ отправил: Стас (статус: Практикант)
Отправлен: 02.09.2005, 01:01
Вопрос № 25.639
1. CSEG segment
assume CS:CSEG, DS:CSEG, SS:CSEG
org 100h

MOV AH, 86h
MOV DX,1388h ; задержка 5 секунд
INT 15h

; проблема такая: задержка не работает, устанавливается флаг CF в 1, т.е. системный таймер был занят
; нужно сделать следующее: после запуско должно пройти 5 сек. и выйти строка mes.
MOV AX,09h
MOV DX,offset mes
INT 21h

INT 20h
mes db ‘message’,0Ah,0Dh,’$’
CSEG ends
end BEGIN

2. Как пользоваться функцией BIOS int 08h
Как я понимаю, то это что-то типа задержки

Что означает следующее:
MOV AL, 20h
OUT 20h, al

3. Можно ли ассемблерной программой зупустить исполнимый файл.
Т.е. типа run path путь к файлу
path db ‘C:Hello.exe’

4. Как работает jna, т.е. в каком случае происходит переход?
как изменяются флаги при:
cmp 6,5
cmp 5,6
cmp 5,5
5. Вася Пупкин задовал вам вопос про проверку на нажатие клавиш!
Нужно сделать следующее:
Приостановить выполнение программы,
ожидать от пользователя клавиш 0-6,
остальное игнорировать, доже Enter, если можно!, т.е. как я понимаю ожидать прерывания от клавиатуры, если пользователь нажал клавишу, то сделать проверку на принадлежность диапазону 0-6, если цифра не входит в диапазон, то начать ожидание вновь!
Это тяжело сделать?

Отправлен: 01.09.2005, 10:07
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: )
Отвечает: Калашников О.А.
Здравствуйте, Терсков Алексей Николаевич!

3. Запустить исполняемый файл можно, воспользовавшись функцией 4Bh прерывания 21h. Функция требует подготовки. Описание и пример можно найти тут:
http://kalashnikoff.ru/Assembler (выпуск № 29)

Ответы на все остальные вопросы вы также найдёте в архиве по указанной выше ссылке.
———
Всё отлично.

Ответ отправил: Калашников О.А. (статус: *Админ)
Отправлен: 01.09.2005, 10:29
Оценка за ответ: 5
Комментарий оценки:
Ну и подготовочка!
Отвечает: Sager
Здравствуйте, Терсков Алексей Николаевич!
1)
mov ah, 86h
mov cx, число_секунд
mov dx, число_микросекунд
int 15h
3)можно. подробнее читай 29 выпуск калшникова, т.к. здесь вызовом

одного прерывания не обойтись — нужно много чего сделать.
4)Переход произойдет при cmp 5,6
в первом случае
pf=0
zf=0
во втором случае
cf=1
pf=1
af=1
sf=1
в третьем
af=0
zf=1
sf=0

5)
again:
mov ah,10h
int 16h
cmp al,’0′-1
jna again
cmp al,’6′
ja again

int 20h; srabotaet if you press 0-6

Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 01.09.2005, 11:11
Отвечает: newinfo2005
Здравствуйте, Терсков Алексей Николаевич!
1.Я точно сам не знаю,но надо еще указать пользовательский байт в es:bx
в AL загрузить 0
2.Да-да вызывается примерно 18.2 раз в секунду,его можно использовать для обработки событий зависищях от времени.А то что ты указал это когда прерывание закончен закончено. Магическая последовательность такова:

MOV AL, 20h;послать сигнал Конец-Прерывания
OUT 20h, al; контроллеру прерываний 8259
3.Я думаю ничего не будет если я тебе из справочника покажу инфу:
4.ниже или равны.
cmp 6,5;на cf & zf это не повлияют
cmp 5,6;cf=1 & zf=0,cf=1 & zf=1 или
cmp 5,5;cf=0 & zf=1
5.h1:mov ah,0
int 16h
cmp al,0;если 0 то в ah содержится расширенный код.
je h1
cmp ah,’1′;и тут уже проверяешь нажатие клавиш можно так же и кодами ascii
cmp ah,13;вроде бы определяет на нажатие ентер.

Программирование в среде однозадачной операционной системы

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

Е.В. Грачева


Системное программное обеспечение

Персональных ЭВМ

доктор технических наук, пофессор

зав.кафедрой «Вычислительные машины и системы»

доктор технических наук, пофессор

кафедры «Информационно-вычислительные системы»

Пензенского государственного университета

Грачева Е.В.

Системное программное обеспечение персональных ЭВМ:

Учебнле пособие /Е.В. Грачева – Пенза

Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»

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

Программирование в операционной среде

Операционной средой называется набор функций ОС, сервисов и правила обращения к ним. Поскольку каждая операционная система имеет свой набор функций и правил обращения к ним, программирование в операционной среде каждой ОС должно рассматриваться отдельно [1].

Программирование в среде однозадачной операционной системы

Программы для MS DOS могут быть одного из двух форматов: COM или EXE.

Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.

Размер программы типа EXE может превышать 64 кб.

В современных операционных средах приложения пользуются системными вызовами, число которых превышает 2000, в то время как в MS-DOS подобных функций гораздо меньше.

Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.

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

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

+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 (FCB, FileControlBlok — это метод работы с файлами, являющийся рудиментом от ранних версий DOS’а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия «каталог» в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).

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

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

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

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

Затем DOS записывает программу в память, начиная с адреса 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 – загрузить и выполнить программу. В качестве параметров этой функции передаются:

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 – подготовиться к выполнению (используется в ОС MS 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 – неправильный формат).

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

В таблице 1 приведены функции прерывания INT 21h.

Таблица 1 -Функции прерывания INT21h

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 9790 — | 7665 — или читать все.

MS-DOS

Операционные системы MS-DOS, Windows 95, Windows 98 и старое железо компьютера — установка, настройка, использование.

MS-DOS 6.22 — установка для игр. Часть 4.

Файлы MS-DOS Config.sys и autoexec.bat .

Данная статья — продолжение цикла статей об установке MS-DOS 6.22 на жёсткий диск для запуска старых-добрых игр. Мы уже произвели минимальную установку системы на жёсткий диск нашего раритетного железного друга, разобрались с основами работы с памятью системы. В данной статье мы детально рассмотрим файлы CONFIG.SYS и AUTOEXEC.BAT . В результате наших действий на жёстком диске компьютера появятся необходимые системные файлы MS-DOS, драйверы, будут осуществлены настройки системы.

Файлы config.sys и autoexec.bat .

Как и ранее, прежде, чем приступить к рассмотрению темы, предлагаем вам скачать с нашего сайта архив файлов MS-DOS 6.22 OEM ver. 1.1.zip.

Конфигурация config.sys и autoexec.bat.

Наши цели и задачи :

  1. Настроить работу памяти (HYMEM.SYS, EMM386.EXE).
  2. Установить драйверы мыши и клавиатуры.
  3. Русифицировать операционной системы (MS-DOS 6.22 rus).
  4. Внести соответствующие записи в файлы CONFIG.SYS и AUTOEXEC.BAT .
  5. Для удобства работы запустить файловый менеджер DOS Навигатор ( Dos Navigator) — естественно на русском языке.
  6. Протестировать настройки памяти с помощью утилиты MEM.EXE, входящей в состав MS-DOS 6.22 .

В результате у нас получится полноценная операционная система MS-DOS 6.22 rus с поддержкой мыши. Работать в системе нам поможет прекрасный менеджер файлов файловый менеджер Dos Navigator. Уже можно запускать игры. Недостаток — отсутствие звука и поддержки привода CD-ROM.

Как DOS загружает программу в память?

Какие шаги выполняет MS-DOS для загрузки COM файла или EXE файла в память? Есть ли еще ссылки в Интернете о том, как это происходит? Лучшее, о чем я могу думать, возможно, относится к источнику dosbox.

Когда command.com будет предложено выполнить файл .com или .exe, он вызовет службу прерывания 21h/AH = 4B, службу EXEC. Для вызывающей программы зависит:


  • постройте блок параметров DOS EXEC (см. http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html) (включает информацию о переменных среды, аргументах командной строки, FCB и значениях регистров при возврате).
  • освободить всю память, вызывающая программа не использует
  • настройки вызывающих аргументов
    • ah = 4Bh (тип сервиса ‘EXEC’)
    • al = 00h (функция «загрузить и выполнить» )
    • ds: dx → имя программы
    • es: bx → ptr для блока параметров exec
  • прерывание вызова 21h
  • в ответ reset указатель стека и проверка ошибок.

Когда вызывается прерывание 21h (здесь, где он становится туманным для меня):

  • выделен выделенный блок памяти
  • расширение файла игнорируется, вместо этого DOS проверяет первые два байта файла подписи «MZ» или «ZM», если EXE, и нет подписи для COM.
  • Заголовок exe считывается для начальных значений регистра
  • раздел кода копирования из exe в память
  • таблица перемещений (см. http://en.wikipedia.org/wiki/Relocation_table) читается и дальние указатели настраиваются в памяти
  • значения регистра установки
    • AL, AH статус буквы письма
    • DS, ES → сегмент PSP (см. http://en.wikipedia.org/wiki/Program_Segment_Prefix)
    • SS: SP → указатель стека (определенный в заголовке exe)
  • перейти к CS: IP → точка входа (определенная в заголовке exe, относительно начала программы)
  • скопировать весь файл .com в память
  • значения регистра установки
    • AL, AH статус буквы письма
    • CS, DS, ES, SS → сегмент PSP
    • SP = смещение последнего слова, доступного в первом сегменте 64k
  • перейти к IP = 100h

Теперь программа должна выполняться.

В документе Microsoft KB «Порядок приоритета при поиске исполняемых файлов» в нем упоминается использование функции MS-DOS EXEC (прерывание 21h service 4Bh) «для выполнения файлов .com и .exe http://support.microsoft.com/kb/35284

Итак, мы можем посмотреть список прерываний Ralph Brown на Int 21/AH = 4Bh

и формат заголовка dos exe:

(это основано на некоторых поисковых системах, поэтому, пожалуйста, не стесняйтесь добавлять предложения)

Dos fn 4bh: выполнить или загрузить программу exec

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

Переключение на кириллицу/латиницу будет выполняться «обычным способом», как и для приложений Windows.

Left Shift + Ctrl — латиница

Right Shift + Ctrl — кириллица

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

Исправлено: Simple777, 06.04.15 15:27

Номер функции Название Входные данные Выходные данные Описание
Функции ввода/вывода данных
01H Ввод с клавиатуры AH = 01H AL = символ, полученный из стандартного ввода Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При распознавании Ctrl-Break выполняется INT 23H. Замечание: Ввод расширенных клавиш ASCII (F1-F12, pgup, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
02H Вывод на дисплей AH = 02H DL = символ, выводимый на стандартный вывод Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23H.
03H Вспомогательный ввод AH = 03H AL = символ, полученный со стандартного вспомогательного устр-ва Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL. Замечание: Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.
04H Вспомогательный вывод AH = 04H DL = символ, записываемый на стандартное вспомогательное устр-во Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05H Вывод на принтер AH = 05H DL = символ, записываемый на стандартный принтер Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Замечание: Команда DOS «MODE» может перенаправить этот вывод в последовательный порт.
06H Консольн. ввод-вывод AH = 06H DL = символ (от 0 до 0feh), посылаемый на стандартный вывод DL = 0ffh запрос ввода со стандартного ввода ZF = Сброшен (NZ), если символ готов при запросе ввода При DL = 0ffh выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод. Замечание: Не проверяет Ctrl-Break. Вызывайте дважды для расширенного ASCII.
07H Нефильтрующий консольный ввод без эха AH = 07H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break, backspace и т.п. Замечания Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).
08H Консольный ввод без эха AH = 08H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23H. Замечание: Вызывайте дважды для ввода расширенного символа ASCII.
09H Выдать строку на дисплей AH = 09H DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H) Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02H Display Char. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 0dh и ASCII 0ah). Строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).
0ah Ввод строки в буфер AH = 0ah DS:DX = адрес входного буфера (смотри ниже) Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh) При входе буфер по адресу DS:DX должен быть оформлен так:
Max * * * *

Где max – максимальная допустимая длина ввода (от 1 до 254)

При выходе буфер заполнен следующим образом:

Max Len T E X T 0dh

Где len– действительная длина данных без завершающего CR (здесь — 04H). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (который не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

0bh Проверить статус ввода AH = 0bh AL = 0ffh, если символ доступен со стандартного ввода Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23H. Замечание: используйте перед функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши. Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет вам снимать счет по нажатию Ctrl-Break.
0ch Ввод с очисткой AH = 0ch AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0ah) Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H ввод с клавиатуры 06H ввод с консоли 07H Нефильтрующий без эха 08H ввод без эха 0ah буферизованный ввод
Операции с файлами
3ch Создать файл через описатель (дескриптор) AH = 3ch DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибки нет DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) оглавлении Файл открывается в режиме доступа чтение/запись Вы должны сохранить описатель (дескриптор, handle) для последующих операций. Если файл уже существует: При открытии файл усекается до нулевой длины Если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут) CONFIG.SYS специфицирует число доступных описателей в системе Используйте функцию 5bh создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
3dh Открыть описатель файла AH = 3dh DS:DX = адрес строки ASCIIZ с именем файла AL = режим открытия AX = код ошибки если CF установлен и описатель файла если нет ошибки. DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл должен существовать. См. Функцию 3ch (создать файл). Файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте: AL = 0 чтобы открыть для чтения AL = 1 чтобы открыть для записи AL = 2 чтобы открыть для чтения и записи Указатель чтения/записи устанавливается в 0. См. 42H (LSEEK) Вы должны сохранить описатель (handle) для последующих операций Разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения. CONFIG.SYS специфицирует число доступных описателей файлов.
3eh Закрыть описатель файла AH = 3eh BX = описатель файла AX = код ошибки если CF установлен BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой. Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3fh Читать файл через описатель AH = 3fh BX = описатель файла DS:DX = адрес буфера для чтения данных CX = число считываемых байт AX = код ошибки если CF установлен или число действительно прочитанных байт CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): Если AX = CX, (и CF сброшен) — чтение было корректным без ошибок Если AX = 0, достигнут конец файла (EOF) Если AX При чтении с устройства — входная строка имеет длину AX байт При чтении из файла — в процессе чтения достигнут EOF Замечания: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dh).
40H Писать в файл через описатель AH = 40H BX = описатель файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок) CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи). Если AX = CX, запись была успешной Если AX Замечание: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю осуществлять собственное блокирование. Удобно использовать эту функцию для вывода на умалчиваемые устройства, такие как стандартный вывод, взамен использования различных функций вывода текста.
42H Установить указатель файла – LSEEK 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.
Операции с файловой системой
0dh Сброс диска AH = 0dh Сбрасывает (пишет на диск) все файловые буфера. Если размер файла изменился, такой файл должен быть предварительно закрыт (при помощи функций 10H или 3eh).
0eh Установить текущий диск DOS AH = 0eh DL = номер диска (0=A, 1=B и т.д.), который становится текущим AL = общее число дисководов в системе Диск, указанный в DL, становится текущим (умалчиваемым) в DOS. Проверка: используйте функцию 19H «дать текущий» для проверки. В регистре AL возвращается число дисководов всех типов, включая твердые диски и «логические» диски (как B: в 1-floppy системе).
19H Дать текущий диск DOS AH = 19H AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.) Возвращает номер дисковода текущего умалчиваемого диска DOS.
1bh Дать информацию FAT (текущий диск) AH = 1bh DS:BX = адрес байта FAT > Возвращает информацию о размере и типе умалчиваемого диска. Размер диска в байтах = (DX*AL*CX). Ищите свободную память функциями 36h Disk Free или 32h Disk Info. Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь порцию всей FAT. Предупреждение: Эта функция изменяет содержимое регистра DS.
1ch Дать информацию FAT (любой диск) AH = 1ch DL = номер диска (0=текущий, 1=A, и т.д.) DS:BX = адрес байта FAT > Аналогична функции 1bh Get FAT Cur, с той разницей, что регистр DL указывает диск, для которого вы хотите получить информацию. Версии: Недоступна для DOS 1.x.
32H Дать информацию DOS о диске AH = 32H DL = номер диска (0=текущий, 1=A, и т.д.) AL = 0 если DL задавал корректный диск FF = 0ffh если диск задан неверно DS:BX = адрес блока информации диска для запрошенного устройства Возвращает блок информации, представляющей интерес для приложений и утилит, выполняющих доступ к диску, поддерживаемый драйверами устройств, на уровне секторов. Некоторые дисководы (особенно незагружаемые) функционируют исключительно через свои драйверы устройств. Такие диски могут содержать неверную информацию в корневой записи и таблице разделов, что делает очень трудным определение, например, размера корневого оглавления, числа таблиц FAT, и т.п. Блок информации диска содержит все данные такого рода в хорошо форматированной структуре. Это может быть единственным способом определить адрес драйвера устройства. Предупреждение: Изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.
36H Дать свободную память диска AH = 36H DL = номер диска (0=текущий, 1=A, и т.д.) AX = 0ffffh, если AL содержал неверный номер диска или число секторов на кластер, если нет ошибок. BX = доступных кластеров. CX = байт на сектор. DX = всего кластеров на диске. Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX*BX*CX) всего памяти в байтах = (AX*CX*DX)
39H Создать новое оглавление — MKDIR AH = 39H DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0 если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.
3ah Удалить оглавление – RMDIR AH = 3ah DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление удаляется из структуры оглавления. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется. Замечание: Оглавление не должно содержать файлов и подоглавлений и не должно быть связано возможными ограничениями DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).
3bh Установить умалчиваемое оглавление DOS – CHDIR AH = 3bh DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Указанное подоглавление для указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.
41H Удалить файл AH = 41H DS:DX = адрес строки ASCIIZ с именем файла AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы (‘?’ и ‘*’). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.
43H Установить/опросить атрибут файла – CHMOD AH = 43H DS:DX = адрес строки ASCIIZ с именем файла AL — код подфункции: = 0 — извлечь текущий атрибут файла AL = 1 — установить атрибут файла CX = новый атрибут файла (для подфункции 01H) AX = код ошибки если CF установлен CX = текущий атрибут файла (для подфункции 00H) DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Атрибут файла извлекается или устанавливается, согласно коду в AL. Замечание: Чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы, возможно, ожидали, см. описание файловой системы FAT, аттрибуты файлов).
45H Дублировать описатель файла – DUP AH = 45H BX = существующий описатель файла AX = новый описатель файла, дублирующий оригинал или код ошибки если CF установлен. Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя чтения/записи для одного описателя действует на его дубликат — включая любые операции чтения, записи или перемещения указателя посредством функции 42H LSEEK. Новый описатель наследует ограничения режима открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть описатель, заставляя DOS записать файловые буфера. Такой способ DUP/CLOSE — быстрее, чем закрытие и повторное открытие файла. Оставить комментарий – для сохранения файла без его закрытия – CTRL+S
46H Переназначить описатель – FORCDUP AH = 46H BX = целевой описатель файла (должен уже существовать) CX = исходный описатель файла (должен уже существовать) AX = код ошибки если CF установлен Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Описатель в CX (источник) закрывается, если он открыт, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного в/в. Пример: Откроем файл «C:\STDOUT.TXT» через функцию 3dh Open File и получим описатель (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 — это предопределенный описатель «стандартного выходного устройства»). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через описатель 01. Стало быть, дисковый файл «C:\STDOUT.TXT» будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01 через функцию DOS 40H. Когда вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на обычные устройства (например, описатель 01 устанавливается на «CON»).
47H Дать умалчиваемое оглавление DOS AH = 47H DS:SI = адрес локального буфера для результирующего пути (64 байта) DL = номер диска (0=текущий, 1=A, и т.д.) AX = код ошибка если CF установлен В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Не подставляется впереди буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет вам пустую строку (DS:[SI] = 0).
4eh Найти 1-й совпадающий файл AH = 4fh DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? И *) CX = атрибут файла для сравнения AX = код ошибки если CF установлен DTA = заполнена данными (если не было ошибки) DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы и ? Допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже: Замечания: Атрибут файла обычно используется во «включающем» поиске. Если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (т.е. Attr | 10H). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: Используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H) Уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя Вызовите функцию 4eh (Найти 1-й) Если флаг CF указывает ошибку, вы закончили (нет совпадений) Уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh) Повторять Обработать имя файла и данные по адресу DS:DX Вызвать функцию 4fh (Найти следующий) Пока CF=1 не покажет, что совпадений больше нет
4fh Найти следующий совпадающий файл AH = 4fh DS:DX = адрес данных, возвращенных предыдущей 4eh Найти 1-й файл AX = код ошибки если CF установлен DTA = заполнена данными DS:DX указывает на 2bh-байтовый буфер с информацией, возвращенной функцией 4eh Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. Функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
56H Переименовать/переместить файл AH = 56H DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла) ES:DI = адрес нового ASCIIZ имени (новые путь/имя) AX = код ошибки если CF установлен DS:DX и ES:DI указывают на строки ASCIIZ: «d:\путь\имяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие умолчания. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени. Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.
57H Установить/опросить дату/время файла AH = 57H AL = 0 чтобы получить дату/время файла = 1 чтобы установить дату/время файла BX = описатель файла (handle) CX = (если AL=1) новая отметка времени в формате время/дата файла DX = (если AL=1) новая отметка даты в формате время/дата файла AX = код ошибки если CF установлен CX = отметка времени файла в формате время/дата файла DX = отметка даты файла в формате время/дата файла BX должен содержать описатель открытого файла (см. 3ch или 3dh ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
5ah Создать уникальный временный файл AH = 5ah DOS 3.0+ DS:DX = адрес строки ASCIIZ с диском и путем (заканчивается \) CX = атрибут файла AX = код ошибки если CF установлен и описатель файла (если нет ошибки) DS:DX = (не изменяется) становится полным ASCIIZ-именем нового файла Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к присоединению в его конец имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «d:\путь\»,0 (указаны диск и путь) ИЛИ «d:»,0 (умалчиваемое оглавление диска) ИЛИ «d:\»,0 (корневое оглавление диска) ИЛИ «»,0 (умалчиваемые диск и оглавление) После возврата строка DS:DX будет дополнена именем файла. Замечания: DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Создаваемые таким способом файлы — по существу НЕ ВРЕМЕННЫЕ, и их следует удалять посредством функции DOS 41H , когда они не нужны. Версии: Доступна, начиная с DOS 3.0
5bh Создать новый файл AH = 5bh DOS 3.0+ DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибок нет DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом режиме доступа
5ch Блокировать/разблокировать доступ к файлу AH = 5ch DOS 3.0+ AL = подфункция: 0 = заблокировать область файла = 1 = разблокировать ранее захваченную область BX = описатель файла (handle) CX:DX = смещение ((CX 65536) + DX) от начала файла SI:DI = длина блокируемой области ((SI 65536) + DI) байт AX = код ошибки если CF установлен Блокирует или освобождает доступ к участку файла, идентифицируемого описателем в BX. Область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательны. Разделение файлов ДОЛЖНО быть активизировано (командой SHARE), иначе функция вернет код ошибки «неверный номер функции.» Блокировка действует на операции чтения, записи и открытия со стороны порожденного или конкурирующего процесса. При попытке такого доступа (и режиме доступа , определенном при OPEN как «режим разделения», который запрещает такой доступ), DOS отвергает операцию через вызов INT 24H (обработчик критических ошибок) после трех попыток. DOS при этом выдает сообщение «Abort, Retry, Ignore». Рекомендуемое действие — НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. Это позволяет избежать довольно неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0, DX=0, SI=0ffffh, DI=0ffffh и AL=0. При освобождении, смещение и длина участка должны точно совпадать со смещением и длиной захваченного участка. Замечания: Дублирование описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN выбран режим доступа Inherit, механизм блокировки не даст никаких привилегий доступа порожденным процессам, созданным функцией 4bh EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были сняты до завершения программы. Если вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы снять блокировки до действительного завершения программы. Рекомендуется освобождать блокировки как можно скорее. Всегда блокируйте, обрабатывайте файл и освобождайте блокировку одной операцией. Версии: Доступна, начиная с DOS 3.0
Операции с системой прерываний
25H Установить вектор прерывания AH = 25H AL = номер прерывания DS:DX = вектор прерывания: адрес программы обработки прерывания Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы. Предупреждение: Не забудьте восстановить DS (если необходимо) после этого вызова.
26H Построить PSP AH = 26H DX = адрес сегмента (параграфа) для нового PSP CS = сегмент PSP, используемого как шаблон для нового PSP Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100H байт, начиная с CS:0), копируется в DX:0 Поле memtop соответственно корректируется Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете загрузить программу с диска и передать ей управление посредством FAR JMP. Замечание: Если вы перехватываете INT 21H, позаботьтесь о помещении в стек корректного CS:IP. Еще лучше использовать функцию 4ch (EXEC).
2ah Дать системную дату AH = 2ah AL = день недели (0=Вск, 1=Пнд. 6=Суб) DOS 3.0+ CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) Возвращает текущую дату, как она известна системе. Версии: DOS 2.x не гарантирует возврата в AL значения дня; все версии 1.0+ возвращают правильный день недели. Версии до 2.1 имеют проблемы с переходом даты.
2bh Установить системную дату AH = 2bh CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) AL = 0 если дата корректна Устанавливает системную дату DOS.
2ch Дать время DOS AH = 2ch CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) Возвращает текущее время, как оно известно системе. Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2dh Установить время DOS AH = 2dh CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) AL = 0 если время корректно Устанавливает системное время DOS.
2eh Установить/сбросить переключатель верификации AH = 2eh AL = 0 отключить верификацию = 1 включить верификацию Устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но гарантирует максимальную надежность записи. Функция 56H Get Verify возвращает текущий статус верификации DOS.
2fh Дать адрес текущей DTA AH = 2fh ES:BX = адрес начала текущей DTA Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Уст. DTA». Замечание: Эта функция изменяет сегментный регистр ES.
30H Дать номер версии DOS AH = 30H AL = старший номер версии AH = младший номер версии BX,CX = 0000H DOS 3.0+ Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в AH — 2. Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0. Версии: DOS 2.x не гарантирует очистки регистров CX и BX.
31H Завершиться и остаться резидентным – KEEP AH = 31H AL = код выхода DX = объем памяти, оставляемой резидентной, в параграфах Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.
33H Установить/опросить статус Ctrl-Break AH = 33H AL = 0 чтобы опросить текущий статус контроля Ctrl-Break AL = 1 чтобы установить статус контроля Ctrl-Break DL = требуемый статус (0=OFF, 1=ON) (только при AL=1) DL = текущий статус (0=OFF, 1=ON) Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). При обнаружении, выполняется INT 23H (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.
35H Дать вектор прерывания AH = 35H AL = номер прерывания (00H до 0ffh) ES:BX = адрес обработчика прерывания Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2]. Предупреждение: Эта функция изменяет сегментный регистр ES.
44H Управление устройством в/в – IOCTL AH = 43H AL = код подфункции: AL = 0ch — (зарезервировано) Прочие = (в зависимости от подфункции) AX = код ошибки если CF установлен или иное значение (в зависимости от подфункции) IOCTL предоставляет метод взаимодействия с устройствами и получения информации о файлах. Входные параметры и выходные значения варьируются в зависимости от кода подфункции в регистре AL. Версии: Подфункции 0-7 . DOS 2.1+ Подфункции 8,0bh . DOS 3.0+ Подфункции 9,0ah . DOS 3.1+ Подфункции 0dh,0eh,0fh . DOS 3.2+ ———————————— Подфункция 00H: Запросить флаги информации об устройстве Вход: BX= описатель файла (устройство или дисковый файл) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 01H: установить флаги информации об устройстве Вход: BX = описатель файла (устройство или дисковый файл) DX = IOCTL Инф об устр (DH должен быть нулевым) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 02-03: читать (AL=02H) или писать (AL=03H) строку IOCTL на СИМВОЛЬНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX= число передаваемых байт BX= описатель файла (только устройство — не файл!) Выход: AX= код ошибки если CF установлен ———————————— Подфункция 04-05: читать (AL=04H) или писать (AL=05H) строку IOCTL на БЛОЧНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX = число передаваемых байт BL = : Вход: CL = код действия 40H = установить параметры устройства 60H = дать параметры устройства 41H = писать дорожку логического устройства 61H = читать дорожку логического устройства 42H = форматировать дорожку с верификацией 62H = Верифицировать дорожку логического устройства DS:DX=> адрес пакета данных IOCTL Выход: AX= код ошибки если CF установлен DS:DX=> пакет данных может содержать информацию возврата. ———————————— Подфункция 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству. [DOS 3.2+] Вход: BL= . Эта функция позволяет вам сообщать DOS, что диск с указанным >
48H Распределить память (дать размер памяти) AH = 48H BX = запрошенное количество памяти в 16-байтовых параграфах AX = код ошибки если CF установлен BX = размер доступной памяти в параграфах (если памяти не хватает) AX = сегментный адрес распределенного блока (если нет ошибок) Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный кусок, общепринято устанавливать BX=0ffffh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX. Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
49H Освободить распределенный блок памяти AH = 49H ES = сегментный адрес (параграф) освобождаемого блока памяти AX = код ошибки если CF установлен Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
4ah Сжать или расширить блок памяти AH = 4ah ES = сегмент распределенного блока памяти BX = желаемый размер блока в 16-байтовых параграфах AX = код ошибки если CF установлен BX = наибольший доступный блок (если расширение неудачно) Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать. Замечание: Функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
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. AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность: 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 восстанавливаются в их предыдущие значения. AL=3 LOAD: Эта подфункция используется для загрузки «оверлея». DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE. Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную строку COMSPEC= в окружении перед вызовом этой функции. Вместо разбора собственных 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.
4ch Завершить программу – EXIT AH = 4ch AL = код выхода Возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP. Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.
4dh Дать код выхода программы – WAIT AH = 4dh AL = код выхода последнего завершившегося процесса AH = 0 — нормальное завершение AH = 1 — завершение через Ctrl-Break AH = 2 — завершение по критической ошибке устройства AH = 3 — завершение через функцию 31H KEEP Возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
54H Дать переключатель верификации DOS AH = 54H AL = 0 если верификация выключена (OFF) AL = 1 если верификация включена (ON) Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
59H Дать расширенную информацию об ошибке AH = 59H DOS 3.0+ BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2) AX = расширенный код ошибки (0, если не было ошибки) BH = класс ошибки BL = предлагаемое действие CH = сфера (где произошла ошибка) Используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). Вызывайте ее: В обработчике критических ошибок INT 24H После любой функции INT 21H , возвратившей Carry-флаг После вызова FCB-функции, возвратившей AL=0ffh Версии: Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.
5eh Разные сетевые функции AH = 5eh DOS 3.1+ AL = подф.: 0=дать имя машины (узла) в сети AL = 2=установить стартовую строку сетевого принтера AL = 3=извлечь стартовую строку сетевого принтера Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Прочие = (зависят от подфункции) Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 00H: Извлекает имя машины (узла), как оно известно в сети. Вход: DS:DX=> буфер пользователя для ASCIIZ сетевого имени Выход: DS:DX=> буфер, содержащий сетевое имя CH= 0=имя не определено; иначе=имя определено CL= номер имени NETBIOS (если CH ненулевой) AX= код ошибки если CF установлен Замечание: Сетевое имя — 15-симв. (дополненная пробелами) строка ASCIIZ ———————————— Подф. 02H: Задает настроечную строку, посылаемую на принтер каждый раз, когда эта машина выдает результаты на сетевой принтер. Вход: DS:SI=> буфер, содержащий настроечную строку (до 64 байт) CX= длина настроечной строки BX= индекс в списке назначений, отвечающий принтеру Выход: AX= код ошибки если CF установлен ———————————— Подф. 03H: Извлекает настроечную строку принтера, заданную ранее посредством DOS Fn 5eh подф. 02H. Вход: DS:DI=> 64-байтовый буфер пользователя для результата bx= индекс принтера в списке назначений Выход: ES:DI=> буфер, заполненный настроечной строкой CX= длина настроечной строки AX= код ошибки если CF установлен Замечание: Поскольку индекс в списке назначений может измениться в любой момент, используйте функцию 5fh подф. 02H, чтобы получить индекс непосредственно перед вызовом этой функции.
5fh Переназначение устройств в сети AH = 5fh DOS 3.1+ AL = подф.: 2=получить элемент списка переназначений устройств = 3=переназначить сетевое устройство = 4=отменить переназначение сетевого устройства Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 02H: Извлекает элемент из списка переназначений сетевых устройств. Вход: DS:DI=> 128-байтовое ASCIIZ локальное имя устр. («LPT1»,0) ES:DI=> 128-байтовый буфер с ASCIIZ сетевым именем BX= индекс в списке назначений Выход: DS:DI=> ASCIIZ локальное имя устройства (напр., «LPT1»,0) ES:DI=> ASCIIZ сетевое имя BL= тип устр: 3=принтер; 04=файл ‘устройство’ BH= статус устр: бит 0=1 -неверное устр.; 0=верное CX= сохраненный параметр (при NETBIOS, всегда 0) AX= код ошибки если CF установлен DX,BP = (изменены) Замечание: обычно эту функцию вызывают с BX=0, затем повторяют вызовы, увеличивая значение BX, пока DOS не вернет ошибку 12H (больше нет файлов). ———————————— Подф. 03H: этот вызов определяет имена оглавлений для сети и перенаправляет доступ на сетевые принтеры. Замеч: доступ к принтеру переназначается на уровне ROM-BIOS INT 17H. Вход: DS:SI = ASCIIZ имя исходного устройства ES:DI = ASCIIZ назначение (сетевой путь с паролем) BL= тип устр: 03=принтер; 04=файл ‘устройство’ CX= параметр для вызывающего (задавайте 0 для NETBIOS) Выход: AX= код ошибки если CF установлен Замеч: если BL=03, то источник задает ASCIIZ-имя принтера (например, «LPT1»,0). Назначение кодируется в форме: [\\computername\],0,[password],0. Если пароль начинается с 00, считается, что пароля нет. Если BL=04, то источник задает ASCIIZ-имя диска (например, «F:»,0), а назначение — ASCIIZ-имя пути. После вызова этой функции, локальные обращения к этому диску переназначаются на выбранные имя компьютера и путь. ———————————— Подф. 04H: Отменить сетевое переназначение для указанного устройства. Вход: DS:SI=> ASCIIZ-имя устройства или ,0), то переназначение этого диска прекращается, и ID диска восстанавливает свое предыдущее значение.
Re: Как запустить программу dos FP2.6 в Win7
x370

Сообщений: 9

Дата: 06.04.15 18:10:47

спасибо!
именно то, что нужно!

все изменил. как будто все изменилось,после перезагрузки все правильно ..
только не переключается на русский язык все равно никак..
режим индикации языка на панеле задач меняется EN/RU ,
а вводить русский текст не получается ..
как в фоксовской програме, работающей под ACE.
так и в обычном штатном дос-редакторе операционке «edit» (редактор от древнего досовского QB)

что еще можно попробовать изменить?

еще раз спасибо за помощь!
еще бы чуть-чуть .

Re: Как запустить программу dos FP2.6 в Win7
Simple777

Сообщений: 25030

Дата: 06.04.15 18:22:50

Загрузка дополнительного русификатора была отключена? В config.nt дополнительная строка прописана?

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

Можно проверить работу русификации через реестр на нескольких разных компьютерах.

Возможно, проблема связана с конкретной сборкой Windows. Недавно Igor Korolyov что-то писал про «грязные хаки» в реестре Windows.

Исправлено: Simple777, 06.04.15 18:28

Re: Как запустить программу dos FP2.6 в Win7
x370

Сообщений: 9

Дата: 06.04.15 18:32:25

спасибо за быстрый ответ!

мне тоже кажется, что все четко прописано ..
попробую на других семерках.
но у меня практически чистая винда .

Re: Как запустить программу dos FP2.6 в Win7
Crispy

Сообщений: 14935

Дата: 06.04.15 18:33:41

Тут важный нюанс — на русский — можно переключить только правой комбинацией клавиш! И наоборот. Т.е. никакой универсальности — как для виндовских программ. Возможно в этом проблема. Потому что все остальное, если оно настроено, на 32-битной системе должно работать.

Re: Как запустить программу dos FP2.6 в Win7
Simple777

Сообщений: 25030

Дата: 06.04.15 18:34:45
Re: Как запустить программу dos FP2.6 в Win7
x370

Сообщений: 9

Дата: 06.04.15 18:40:06
Re: Как запустить программу dos FP2.6 в Win7
Simple777

Сообщений: 25030

Дата: 06.04.15 18:47:12

Не исключено, что в autoexec.nt могли остаться какие-нибудь строчки для загрузки старого русификатора.

Можно попробовать загружать приложение через индивидуальные config.nt и autoexec.nt

Я однажды несколько часов провозился c одним компом, где тоже были глюки с переключением клавиатуры. В дальнейшем выяснилось, что один «заботливый админ» зачем-то поставил в autoexec.nt (или config.nt) загрузку программы tame, притом глючную версию. Проблема ушла после отключения загрузки tame

Так что в файлах конфигурации для DOS-сессий может оказаться что угодно.

Исправлено: Simple777, 06.04.15 18:52

MS-DOS

Операционные системы MS-DOS, Windows 95, Windows 98 и старое железо компьютера — установка, настройка, использование.

MS-DOS 6.22 — установка для игр. Часть 4.

Файлы MS-DOS Config.sys и autoexec.bat .

Данная статья — продолжение цикла статей об установке MS-DOS 6.22 на жёсткий диск для запуска старых-добрых игр. Мы уже произвели минимальную установку системы на жёсткий диск нашего раритетного железного друга, разобрались с основами работы с памятью системы. В данной статье мы детально рассмотрим файлы CONFIG.SYS и AUTOEXEC.BAT . В результате наших действий на жёстком диске компьютера появятся необходимые системные файлы MS-DOS, драйверы, будут осуществлены настройки системы.

Файлы config.sys и autoexec.bat .

Как и ранее, прежде, чем приступить к рассмотрению темы, предлагаем вам скачать с нашего сайта архив файлов MS-DOS 6.22 OEM ver. 1.1.zip.

Конфигурация config.sys и autoexec.bat.

Наши цели и задачи :

  1. Настроить работу памяти (HYMEM.SYS, EMM386.EXE).
  2. Установить драйверы мыши и клавиатуры.
  3. Русифицировать операционной системы (MS-DOS 6.22 rus).
  4. Внести соответствующие записи в файлы CONFIG.SYS и AUTOEXEC.BAT .
  5. Для удобства работы запустить файловый менеджер DOS Навигатор ( Dos Navigator) — естественно на русском языке.
  6. Протестировать настройки памяти с помощью утилиты MEM.EXE, входящей в состав MS-DOS 6.22 .

В результате у нас получится полноценная операционная система MS-DOS 6.22 rus с поддержкой мыши. Работать в системе нам поможет прекрасный менеджер файлов файловый менеджер Dos Navigator. Уже можно запускать игры. Недостаток — отсутствие звука и поддержки привода CD-ROM.

Структура и процесс загрузки EXE-программы

Структура и процесс загрузки EXE-программы

В отличие от COM-программ, EXE-программы могут состоять из нескольких сегментов (кодов, данных, стека). Они могут занимать больше 64Кбайт.

EXE-файл имеет заголовок, который используется при его загрузке. Заголовок состоит из форматированной части, содержащей сигнатуру и данные, необходимые для загрузки EXE-файла, и таблицы для настройки адресов (Relocation Table). Таблица состоит из значений в формате сегмент: смещение. К смещениям в загрузочном модуле, на которые указывают значения в таблице, после загрузки программы в память должен быть прибавлен сегментный адрес, с которого загружена программа.

При запуске EXE-программы системным загрузчиком (вызовом функции DOS 4Bh) выполняются следующие действия:

1. Определяется сегментный адрес свободного участка памяти, размер которого достаточен для размещения программы.

2. Создается и заполняется блок памяти для переменных среды.

3. Создается блок памяти для PSP и программы (сегмент:0000h – PSP; сегмент+0010h:0000h – программа). В поля PSP заносятся соответствующие значения.

4. Адрес DTA устанавливается равным PSP:0080h.

5. В рабочую область загрузчика считывается форматированная часть заголовка EXE-файла.

6. Вычисляется длина загрузочного модуля по формуле: Size=((PageCnt*512)–(HdrSize*16))–PartPag.

7. Определяется смещение загрузочного модуля в файле, равное HdrSize*16.

8. Вычисляется сегментный адрес (START_SEG) для загрузки – обычно это PSP+10h.

9. Считывается в память загрузочный модуль (начиная с адреса START_SEG:0000).

10. Для каждого входа таблицы настройки:

a) читаются слова I_OFF и I_SEG;

b) вычисляется RELO_SEG=START_SEG+I_SEG;

c) читается слово по адресу RELO_SEG:I_OFF;

d) к прочитанному слову прибавляется START_SEG;

e) результат запоминается по тому же адресу (RELO_SEG:I_OFF).

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

12. Инициализируются регистры, выполняется программа:

b) АХ=результат проверки правильности идентификаторов драйверов, указанных в командной строке;

Илон Маск рекомендует:  TDateTime - Тип Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL