Командный процессор COMMAND.COM - 2. 3 Пример машинных кодов: непосредственные данные 21

^

Командный процессор COMMAND.COM


Система загружает три части программы COMMAND.COM в память во время сеанса работы постоянно или временно. Ниже описано назначение каждой из трех частей COMMAND.COM:
1.  Резидентная часть непосредственно следует за программой
IBMDOS.COM (и ее области данных), где она находится на протяжении всего сеанса работы. Резидентная часть обрабатывает все ошибки дисковых операций ввода-вывода и управляет следующими прерываниями:
INT 22H Адрес программы обработки завершения задачи.
INT 23H Адрес программы реакции на Ctrl/Break.
INT 24H Адрес программы реакции на ошибки дисковых операций
чтения/записи или сбойный участок памяти в таблице распределения файлов (FAT).
INT 27H Завершение работы, после которого программа остается
резидентной.
2. Часть инициализации непосредственно следует за резидентной частью и содержит средства поддержки AUTOEXEC-файлов. В начале работы системы данная часть первой получает управление. Она выдает запрос на ввод даты и определяет сегментный адрес, куда система должна загружать программы для выполнения. Ни одна из этих программ инициализации не потребуются больше во время сеанса работы. Поэтому первая же команда вводимая с клавиатуры и вызывающая загрузку некоторой программы с диска перекрывают часть инициализации в памяти.
3. Транзитная часть загружается в самые старшие адреса памяти. “Транзит” обозначает, что DOS может перекрыть данную область другими программами, если потребуется. Транзитная часть программы COMMAND.COM выводит на экран приглашение DOS A> или C>, вводит и выполняет запросы. Она содержит настраивающий загрузчик и предназначена для загрузки COM- или EXE-файлов с диска в память для выполнения. Если поступил запрос на выполнение какой-либо программы, то транзитная часть строит префикс программного сегмента (PSP) непосредственно вслед за резидентной частью COMMAND.COM. Затем она загружает запрошенную программу с диска в память по смещению шест.100 от начала программного сегмента, устанавливает адреса выхода и передает управление в загруженную программу. Ниже приведена данная последовательность:
IBMBIO.COM
IBMDOS.COM COMMAND.COM (резидент)
Префикс программного сегмента
Выполняемая программа
...
COMMAND.COM (транзитная часть, может быть перекрыта).
Выполнение команды RET или INT 20H в конце программы приводит к возврату в резидентную часть COMMAND.COM. Если транзитная часть была перекрыта, то резидентная часть перезагружает транзитную часть с диска в память.
    1. ^

      Префикс программного сегмента


Префикс программного сегмента (PSP) занимает 256 (100H) байт и всегда предшествует в памяти каждой COM- или EXE-программе, которая должна быть выполнена. PSP содержит следующие поля:
00  Команда INT 20H (CD20).
02  Общий размер доступной памяти в формате хххх0. Напримеp,  512K
указывается как 8000H вместо 80000H.
04  Зарезервировано.
05  Длинный вызов диспетчера функций DOS.
0A Адрес подпрограммы завершения.
0E Адрес подпрограммы реакции на Ctrl/Break.
12  Адрес подпрограммы реакции на фатальную ошибку.
16  Зарезервировано.
2C Сегментный адрес среды для хранения ASCIIZ строк.
50  Вызов функций DOS (INT 21H и RETF).
5C Параметрическая область 1, форматированная как стандартный
неоткрытый блок управления файлов (FCB#1).
6C Параметрическая область 2, форматированная как стандартный
неоткрытый блок управления файлом (FCB#2); перекрывается, если блок FCB#1 открыт.
80-FF Буфер передачи данных (DTA).
Буфер передачи данных DTA
- ------------------------
Данная часть PSP начинается по адресу 80H и представляет собой буферную область ввода-вывода для текущего дисковода. Она содержит в первом байте число, указывающее сколько раз были нажаты клавиши на клавиатуре непосредственно после ввода имени программы. Начиная со второго байта, находятся введенные символы (если таковые имеются). Далее следует всевозможный “мусор”, оставшийся в памяти после работы предыдущей программы. Следующие примеры демонстрируют назначение буфера DTA:
Пример1. Команда без операндов. Предположим, что вы вызвали программу CALCIT.EXE для выполнения с помощью команды CALCIT [return]. После того, как DOS построит PSP для этой программы, он установит в буфере по адресу шест.80 значение шест.000D. Первый байт содержит число символов, введенных с клавиатуры после имени CALCIT, исключая символ “возврат каретки”. Так как кроме клавиши Return не было нажато ни одной, то число символов равно нулю. Второй байт содержит символ возврата каретки, шест.0D. Таким образом, по адресам шест.80 и 81 находятся 000D.
Пример2. Команда с текстовым операндом. Предположим, что после команды был указан текст (но не имя файла), например, COLOR BY, обозначающий вызов программы COLOR и передачу этой программе параметра ”для установки голубого цвета на желтом фоне. В этом случае, начиная с адреса шест.80, DOS установит следующие значения байт:
80: 03 20 42 59 0D
Эти байты обозначают длину 3, пробел, ”и возврат каретки.
Пример3. Команда с именем файла в операнде. Программы типа DEL (удаление файла) предполагают после имени программы ввод имени файла в качестве параметра. Если будет введено, например, DEL B:CALCIT.OBJ [return], то PSP, начиная с адресов шест.5C и шест.80, будет содержать:
5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A
^ C A L C I T O  B  J
80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D
B : C A L C I T  . 0 B J
Начиная с адреса шест.5C, находится неоткрытый блок FCB, содержащий имя файла, который был указан в параметре, CALCIT.OBJ, но не имя выполняемой программы. Первый символ указывает номер дисковода (02=B в данном случае). Следом за CALCIT находятся два пробела, которые дополняют имя файла до восьми символов, и тип файла, OBJ. Если ввести два параметра, например:
progname A:FILEA,B:FILEB
тогда DOS построит FCB для FILEA по смещению шест.5C и FCB для FILEB по смещению шест.6C.
Начиная с адреса шест.80 в этом случае содержится число введенных символов (длина параметров) —16, пробел (шест.20) A:FILEA,B:FILEB и символ возврат каретки (OD).
Так как PSP непосредственно предшествует вашей программе, то возможен доступ к области PSP для обработки указанных файлов или для предпринятия определенных действий. Для локализации буфера DTA COM-программа может просто поместить шест.80 в регистр SI и получить доступ следующим образом:
MOV SI,80H ;Адрес DTA
CMP BYTE PTR [SI],0 ;В буфере нуль?
JE EXIT
Для EXE-программы нельзя с уверенностью утверждать, что кодовый сегмент непосредственно располагается после PSP. Однако, здесь при инициализации регистры DS и ES содержат адрес PSP, так что можно сохранить содержимое регистра ES после загрузки регистра DS:
MOV AX,DSEG
MOV DS,AX
^ MOV SAVEPSP,ES
Позже можно использовать сохраненный адрес для доступа к буферу PSP:
MOV SI,SAVEPSP
CMP BYTE PTR [SI+ 80H],0 ;В буфере нуль?
JE EXIT
DOS версии 3.0 и старше содержит команду INT 62H, загружающую в регистр BX адрес текущего PSP, который можно использовать для доступа к данным в PSP.

    1. kto-mi-i-zachem-rano-ili-pozdno-chelovek-zadaet-sebe-eti-voprosi-i-pitaetsya-najti-na-nih-otveti-stranica-8.html
      kto-mi-i-zachem-rano-ili-pozdno-chelovek-zadaet-sebe-eti-voprosi-i-pitaetsya-najti-na-nih-otveti-stranica-9.html
      kto-mi-i-zachem-rano-ili-pozdno-chelovek-zadaet-sebe-eti-voprosi-i-pitaetsya-najti-na-nih-otveti.html
      kto-mi-konservatori-ili-net-zashita-prav-intellektualnoj-sobstvennosti-hozyajstvennimi.html
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат
      Реферат