Когда command.com просят выполнить файл .com или .exe, он вызывает службу прерывания 21h / AH = 4B, службу EXEC. В зависимости от вызывающей программы:
- построить блок параметров DOS EXEC (см. http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html)
(включает информацию о переменных среды, аргументах командной строки, FCB и значениях регистров при возврате)
- освободить всю память, которую вызывающая программа не использует
- установка регистров аргументов вызова
- ах = 4Bh (тип услуги «EXEC»)
- al = 00h (функция «загрузить и выполнить»)
- ds: dx -> имя программы
- es: bx -> ptr для блока параметров exec
- прерывание вызова 21ч
- при возврате стека указателя возврата и проверки на ошибки.
Когда вызывается прерывание 21h (вот для меня это становится туманным):
- выделен блок памяти, выровненный по странице
- расширение файла игнорируется, вместо этого DOS проверит первые два байта
файла для подписи "MZ" или "ZM", если EXE, и нет подписи для COM.
для exe:
- exe-заголовок считывается для начальных значений регистра
- копировать секцию кода из exe в память
- таблица перемещений (см. http://en.wikipedia.org/wiki/Relocation_table) читается и
дальние указатели настроены в памяти
- установка значений регистра
- перейти к CS: IP -> точке входа (определено в заголовке exe относительно начала программы)
для ком:
- копировать весь файл .com в память
- установка значений регистра
- AL, AH статус буквы диска
- CS, DS, ES, SS -> PSP сегмент
- SP = смещение последнего слова, доступного в первом сегменте 64k
- переход на IP = 100h
Программа должна выполняться.
Примечания:
В документе Microsoft KB "Порядок приоритетов при поиске исполняемых файлов" упоминается
использование «MS-DOS EXEC function (interrupt 21h service 4Bh)» для выполнения файлов .com и .exe
http://support.microsoft.com/kb/35284
Итак, мы можем посмотреть список прерываний Ральфа Брауна в Int 21 / AH = 4Bh
и пример использования:
и формат заголовка dos exe:
(это основано на поиске в Google, поэтому, пожалуйста, не стесняйтесь добавлять предложения)