Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 62 63 64 65 66 67 68  69 70 71 72 73 74 75 ... 85
          указывается как 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 и  передачу  этой  программе  параметра
"BY" для установки голубого цвета на желтом фоне. В этом случае, начиная с
адреса шест.80, DOS установит следующие значения байт:

               80:  03 20 42 59 0D

Эти байты обозначают длину 3, пробел, "BY" и возврат каретки.

     П р и м е р 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.


     ВЫПОЛНЕНИЕ COM-ПРОГРАММЫ
     ________________________________________________________________

     В отличие от EXE-файла, COM-файл не содержит заголовок на диске.  Так
как организация COM-файла намного проще, то  для  DOS  необходимо  "знать"
только то, что тип файла - COM.
     Как описано выше, загруженным в память COM- и EXE-файлам предшествует
префикс программного сегмента.  Первые два байта этого  префикса  содержат
команду  INT  20H  (возврат  в  DOS).  При  загрузке  COM-программы    DOS
устанавливает в четырех сегментных  регистрах  адрес  первого  байта  PSP.
Затем устанавливается указатель стека  на  конец  64  Кбайтового  сегмента
(шест.FFFE) или на конец памяти, если сегмент  не  достаточно  большой.  В
вершину стека заносится нулевое слово.  В командный  указатель  помещается
шест.100  (размер  PSP).  После  этого  управление  передается  по  адресу
регистровой пары CS:IP, т.е. на  адрес  непосредственно  после  PSP.  Этот
адрес  является  началом  выполняемой  COM-программы  и  должен  содержать
выполнимую команду.
     При выходе из программы команда RET  заносит  в  регистр  IP  нулевое
слово, которое было записано в вершину стека  при  инициализации.  В  этом
случае в регистровой паре CS:IP получается адрес первого  байта  PSP,  где
находится  команда  INT  20H.  При  выполнении  этой  команды   управление
передается в резидентную часть COMMAND.COM. (Если программа завершается по
команде INT 20H вместо RET, то  управление  непосредственно  передается  в
COMMAND.COM).


     ВЫПОЛНЕНИЕ EXE-ПРОГРАММЫ
     ________________________________________________________________

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

00   Шест.4D5A.  Компоновщик  устанавливает  этот  код  для  идентификации
     правильного EXE-файла.
02   Число байтов в последнем блоке EXE-файла.
04   Число 512 байтовых блоков EXE-файла, включая заголовок.
06   Число настраиваемых элементов.
08   Число 16-тибайтовых блоков (параграфов) в заголовке,  (необходимо для
     локализации начала выполняемого модуля, следующего после заголовка).
0A   Минимальное  число  параграфов,   которые  должны   находится   после
     загруженной программы.
0C   Переключатель загрузки в младшие или старшие  адреса.  При компановке
     программист должен решить,  должна ли его программа  загружаться  для
     выполнения  в  младшие  адреса  памяти или в старшие Обычным является
     загрузка в младшие адреса. Значение шест.0000 указывает на загрузку в
     старшие  адреса,  а  шест.FFFF - в младшие.  Иные значения определяют
     максимальное  число  параграфов,  которые  должны  находиться   после
     загруженной программы.
0E   Относительный адрес сегмента стека в выполняемом модуле.
10   Адрес,который загрузчик должен поместить в регистр SP перед передачей
     управления в выполнимый модуль.
12   Контрольная сумма - сумма всех слов в файле (без  учета переполнений)
     используется для проверки потери данных.
14   Относительный адрес,  который загрузчик должен поместить в регистр IP
     до передачи управления в выполняемый модуль.
16   Относительный адрес кодового  сегмента  в  выполняемом  модуле.  Этот
     адрес загрузчик заносит в регистр CS.
18   Смещение первого настраиваемого элемента в файле.
1A   Номер оверлейного фрагмента: нуль обозначает, что заголовок относится
     к резидентной части EXE-файла.
1C   Таблица  настройки,   содержащая   переменное   число   настраиваемых
     элементов, соответствующее значению по смещению 06.

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

          - Считывает форматированную часть заголовка в память.
          - Вычисляет размер выполнимого  модуля  (общий  размер  файла  в
     позиции 04 минус размер заголовка в позиции 08) и загружает модуль  в
     память с начала сегмента.
          - Считывает элементы  таблицы  настройки  в  рабочую  область  и
     прибавляет  значения  каждого  элемента  таблицы  к  началу  сегмента
     (позиция OE).
          - Устанавливает в регистрах SS и  SP  значения  из  заголовка  и
     прибавляет адрес начала сегмента.
          - Устанавливает в регистрах DS и ES  сегментный  адрес  префикса
     программного сегмента.
          - Устанавливает в регистре CS адрес PSP  и  прибавляет  величину
     смещения в заголовке (позиция 16) к регистру CS.  Если  сегмент  кода
     непосредственно следует за PSP, то смещение  в  заголовке  равно  256
     (шест.100). Регистровая пара CS:IP содержит стартовый адрес в кодовом
     сегменте, т.е. начальный адрес программы.

     После инициализации регистры CS и SS содержат  правильные  адреса,  а
регистр DS (и ES) должны быть установлены в программе для  их  собственных
сегментов данных:

          1.  PUSH  DS               ;Занести адрес PSP в стек
          2.  SUB   AX,AX            ;Занести нулевое значение в стек
          3.  PUSH  AX               ; для обеспечения выхода из программы
          4.  MOV   AX,datasegname   ;Установка в регистре DX
          5.  MOV   DS,AX            ; адреса сегмента данных

     При завершении программы команда RET заносит  в  регистр  IP  нулевое
значение, которое было помещено в стек в начале  выполнения  программы.  В
регистровой паре CS:IP в этом случае получается  адрес,  который  является
адресом первого байта PSP, где расположена  команда  INT  20H.  Когда  эта
команда будет выполнена, управление перейдет в DOS.


     ПРИМЕР EXE-ПРОГРАММЫ
     ________________________________________________________________

     Рассмотрим следующую таблицу компановки (MAP) программы:

                    Start     Stop      Length    Name      Class
                    00000H    0003AH    003BH     CSEG      CODE
                    00040H    0005AH    001BH     DSEG      DATA
                    00060H    0007FH    0020H     STACK     STACK
                    Program  entry point at 0000:0000

     Таблица MAP содержит относительные (не действительные) адреса каждого
из  трех  сегментов.  Символ  H  после  каждого  значения  указывает    на
шестнадцатиричный формат.  Заметим, что компоновщик может организовать эти
Предыдущая страница Следующая страница
1 ... 62 63 64 65 66 67 68  69 70 71 72 73 74 75 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама