0004 B8 ---- R MOV AX,DSEG

0007 8E D8 MOV DS,AX

Ассемблер оставляет незаполненным машинный адрес сегмента DSEG, который становится элементом таблицы настройки в заголовке. С помощью отладчика DEBUG можно просмотреть завершенную команду в следующем виде:

B8 A313

Значение A313 загружается в регистр DS в виде 13A3. В результате имеем

Регистр Адрес Смещение

CS 139F0 00

DS 13A30 40

SS 13A50 60

Попробуем выполнить трассировку любой скомпонованной программы под управлением отладчика DEBUG (DOS) и обратим внимание на изменяющиеся значения в регистрах:

Команда Изменяющиеся регистры

PUSH DS IP и SP

SUB AX,AX IP и AX (если был не нуль)

PUSH AX IP и SP

MOV AX,DSEG IP и AX

MOV DS,AX IP и DS

Регистр DS содержит теперь правильный адрес сегмента данных. Можно использовать теперь команду D DS:00 для просмотра содержимого сегмента данных DSEG и команду D SS:00 для просмотра содержимого стека.

ФУНКЦИИ ЗАГРУЗКИ И ВЫПОЛНЕНИЯ ПРОГРАММЫ

 

Рассмотрим теперь, как можно загрузить и выполнить программу из другой программы. Функция шест.4B дает возможность одной программе загрузить другую программу в память и при необходимости выполнить. Для этой функции необходимо загрузить адрес ASCIIZ-строки в регистр DX, а адрес блока параметров в регистр BX (в действительности в регистровую пару ES:BX). В регистре AL устанавливается номер функции 0 или 3:

AL=0. Загрузка и выполнение. Данная операция устанавливает префикс программного сегмента для новой программы, а также адрес подпрограммы реакции на Ctrl/Break и адрес передачи управления на следующую команду после завершения новой программы. Так как все регистры, включая SP, изменяют свои значения, то данная операция не для новичков. Блок параметров, адресуемый по ES:BX, имеет следующий формат:

Смещение Назначение

0 Двухбайтовый сегментный адрес строки

параметров для передачи.

2 Четырехбайтовый указатель на командную строку

в PSP+80H.

6 Четырехбайтовый указатель на блок FCB

в PSP+5CH.

10 Четырехбайтовый указатель на блок FCB

 в PSP+6CH.

AL=3. Оверлейная загрузка. Данная операция загружает программу или блок кодов, но не создает PSP и не начинает выполнение. Таким образом можно создавать оверлейные программы. Блок параметров адресуется по регистровой паре ES:BX и имеет следующий формат:

Смещение Назначение

0 Двухбайтовый адрес сегмента для загрузки

файла.

2 Двухбайтовый фактор настройки загрузочного

модуля.

Возможные коды ошибок, возвращаемые в регистре AX: 01, 02, 05, 08, 10 и 11. Программа на рис.22.2 запрашивает DOS выполнить команду DIR для дисковода D.

3.   Структура COM – файла.

 

Для выполнения компоновки можно также создавать COM-файлы. Примером часто используемого COM-файла является COMMAND.COM. Программа EXE2BIN.COM в оперативной системе DOS (3 версия о более) преобразует EXE-файлы в COM-файлы. Фактически эта программа создает так называемый BIN (двоичный) файл, поэтому она и называется "преобразователь EXE в Вin (EXE-to-BIN)". Выходной Вin-файл можно легкостью переименовать в COM-файл.

Какие же различия между EXE и COM-файлах ?

В первую очередь конечно они отличаются заголовками файла. Несмотря на то, что программа EXE2BIN преобразует EXE-файл в COM-файл, существуют определенные различия между программой, выполняемой как EXE-файл и программой, выполняемой как COM-файл.

Размер программы. EXE-программа может иметь любой размер, в то время как COM-файл ограничен размером одного сегмента и не превышает 64К. COM-файл всегда меньше, чем соответствующий EXE-файл; одна из причин этого - отсутствие в COM-файле 512-байтового начального блока EXE-файла.

Сегмент стека. В EXE-программе определяется сегмент стека, в то время как COM-программа генерирует стек автоматически. Таким образом при создании ассемблерной программы, которая будет преобразована в COM-файл, стек должен быть опущен.

Сегмент данных. В EXE программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В COM-программе все данные должны быть определены в сегменте кода. Ниже будет показан простой способ решения этого вопроса.

Инициализация. EXE-программа записывает нулевое слово в стек и инициализирует регистр DS. Так как COM-программа не имеет ни стека, ни сегмента данных, то эти шаги отсутствуют. Когда COM-программа начинает работать, все сегментные регистры содержат адрес префикса программного сегмента (PSP),

- 256-байтового (шест. 100) блока, который резервируется операционной системой DOS непосредственно перед COM или EXE программой в памяти. Так как адресация начинается с шест. смещения 100 от начала PSP, то в программе после оператора SEGMENT кодируется директива ORG 100H.

Обработка. Для программ в EXE и COM форматах выполняется ассемблирование для получения OBJ-файла, и компоновка для получения EXE-файла. Если программа создается для выполнения как EXE-файл, то ее уже можно выполнить. Если же программа создается для выполнения как COM-файл, то компоновщиком будет выдано сообщение:

Warning: No STACK Segment

(Предупреждение: Сегмент стека не определен)

Это сообщение можно игнорировать, так как определение стека в программе не предполагалось. Для преобразования EXE-файла в COM-файл используется программа EXE2BIN.

Между прочим размеры EXE и COM-программ - 788 и 20 байт. Учитывая такую эффективность COM-файлов, производители программных продуктов в большинстве создают свои программы в COM-формате. Для этого есть такой пример как Windows.

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

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

- Объем COM-файла ограничен 64К.

- COM-файл меньше, чем соответствующий EXE-файл.

- Программа, написанная для выполнения в COM-формате не содержит стека и сегмента данных и не требует инициализации регистра DS.

- Программа, написанная для выполнения в COM-формате

использует директиву ORG 100H после директивы SEGMENT для выполнения с адреса после префикса программного сегмента.

- Программа EXE2BIN преобразует EXE-файл в COM-файл,

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

- Операционная система DOS определяет стек для COM-программы или в конце программы, если позволяет размер, или в конце памяти.


Информация о работе «Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология»
Раздел: Информатика, программирование
Количество знаков с пробелами: 112108
Количество таблиц: 40
Количество изображений: 5

0 комментариев


Наверх