Проектирование алгоритмического и программного

Вид материалаДокументы
2.3. Форматы исполняемых кодов
2.3.1. Двоичный формат
Code segment
2.3.2. Шестнадцатеричный формат
2.3.2.1. Intel HEX-86
2.3.2.2. Motorola S HEX
Подобный материал:
1   2   3   4   5   6   7

2.3. Форматы исполняемых кодов


Тип исполняемого кода определяется компилятором (линковщиком). В программном обеспечении, связанном с отладкой и перепрограммированием МПК, используются два формата:

Двоичный (расширения - «.BIN», «.COM», «.PGM»);

Шестнадцатеричный (расширение - «.HEX»).

2.3.1. Двоичный формат


Как отмечалось выше, тело файла с расширениями «.C0M», «.BIN» или «.PGM» представляет собой двоичный образ программы, т.е. содержит набор кодов машинных инструкций, буквально соответствующих последовательности мнемонических команд ассемблера в исходном тексте. В силу этого при программировании МПК исполнительный модуль в виде файла с указанными расширениями может быть сразу «прошит» в ПЗУ.

В операционных средах DOS и Windows платформы Intel существует два типа исполняемых файлов: «.C0M» и «.EXE. Структура файлов с расширениями «.C0M» и «.EXE» представлено на рис.6а. Размер файла «.C0M» не превышает одного сегмента (64K), а размер файла «.EXE» не ограничен по числу сегментов.

Тело файла «.EXE» представляет собой образ задачи, которую построил линковщик, т.е. последовательное сочетание нескольких сегментов – кода, данных, стека, и имеет в начале файла заголовок, размером 512 байт. Заголовок состоит из стандартной части (форматированной зоны) и таблицы настройки адресов (таблицы размещения сегментов). Стандартная часть содержит признак файла «.EXE» - код ‘MZ’ и информацию, позволяющую вычислить размер программы и начальные значения кодового сегмента, сегмента стека и счетчика команд, необходимые для загрузки программы в ОЗУ.





Так, со смещением +2 в стандартной части содержится (2 байта) число байт part_page в последней странице файла (страница равна 512 байт). Со смещением +4 содержится (2 байта) размер программы file_size в страницах. Очевидно, что размер любой программы с расширением «.EXE» вычисляется в байтах как file_size*512+ part_page-512, где последнее вычитаемое есть размер заголовка.

После загрузки в ОЗУ под управлением операционной среды исполняемый модуль программы представляет собой последовательное расположение префикса программного сегмента PSP (Program Segment Prefix) размером 256 байт и загрузочного модуля (рис.6б). Префикс программного сегмента содержит служебную информацию для операционной системы. Для файла с расширением «.C0M» загрузочный модуль совпадает с двоичным образом программы, для файла с расширением «.EXE» он изменяется в соответствии с таблицей настройки адресов.

Так как префикс программного сегмента имеет размер 256 байт (100h), то для правильного старта файла с расширением «.C0M» в операционной среде указатель команд процессора должен быть настроен на стартовый адрес 100h. Это достигается использованием директивы управления адресом «.ORG». Пример начального фрагмента программы с расширением «.C0M» на ассемблере выглядит так:

CODE SEGMENT

ASSUME CS:CODE

.ORG 100h

START: ………….. ;Точка старта программы

…………..

CODE ENDS

END START

Отсутствие указанной директивы приведет к генерации ошибки линковщика.

2.3.2. Шестнадцатеричный формат


Шестнадцатеричный формат характерен для кросс-ассемблеров и представляет собой файл, в котором в текстовом символьном виде записана двоичная информация. Файл разбивается на записи (ASCII-строки) со своими адресами загрузки и контрольными суммами. Каждая запись начинается с поля маркера записи и кончается полем контрольной суммы. Всякая информация, размещенная после поля контрольной суммы до маркера следующей записи, игнорируется.

Существует несколько разновидностей шестнадцатеричного формата, например: Intel-83, Intel-86, Intel-386, Motorola, Tektronix. Рассмотрим две из них.

2.3.2.1. Intel HEX-86


Каждая запись состоит из 6 последовательно расположенных полей. Поле данных имеет переменную длину. Параметры каждого поля представлены в таблице 1.

Таблица 1





Поле


Длина в байтах


Позиция в записи


Описание


1


Маркер записи


1


1


Символ ‘:’ (код 3Ah)


2


Количество байт в записи


2


2 - 3

Количество байт данных

00-признак конца файла


3


Адрес загрузки



4


4 - 7

Начальный адрес загрузки данных текущей записи



4


Тип записи



2


8 - 9

00-двоичные данные

01-конец файла

02-номер параграфа

04-номер сегмента


5


Данные



-


10 - n


По два шестнадцатеричных символа на каждый байт исходной информации, указанной в поле 2


6


Контрольная сумма



2


(n+1) – (n+2)

Контрольная сумма как дополнение до 0 суммы по модулю 256 всех байт в полях 2-5


Для последней записи, содержащей признак конца файла, адрес загрузки используется как адрес старта программы.

Пример 1 записи Intel-86 (в символьном коде):

: 02 0210 00 FB88 69

Здесь: 02h – количество байт данных в записи; 0210h-адрес загрузки; 00h-тип записи (двоичные данные); FB88h-данные; 69h-контрольная сумма.

Пример 2 записи Intel-86 (в символьном коде):

: 00 0000 01 FF

Здесь: 00h – признак конца файла; 0000h-адрес старта программы; 01h-тип записи (конец файла); FFh-контрольная сумма.

2.3.2.2. Motorola S HEX


Каждая запись состоит из 6 последовательно расположенных полей. Поля адреса загрузки и данных имеют переменную длину. Параметры каждого поля представлены в таблице 2.

Таблица 2





Поле



Длина в байтах


Позиция в записи



Описание


1


Индикатор



1


1


Символ ‘S’ (код 53h)


2


Тип записи



1


2


0-заголовок

1 - 16р адресация

2 - 24р адресация

3 - 32р адресация

9 – конец файла


3


Количество байт в записи



2


3 - 4

Со следующего поля (4) до поля контрольной суммы (6) включительно


4


Адрес загрузки



4 – 8


5 - x

x=08 – для 16р адресации

x=10 – для 24р адресации

x=12 – для 32р адресации


5


Данные



-


(x+1) - n

По два шестнадцатеричных символа на каждый байт исходной информации


6



Контрольная сумма


2


(n+1) – (n+2)


Дополнение до 1 суммы по модулю 256 полей

3 - 5


Пример записи Motorola S HEX (в символьном коде):

S 9 03 0000 FC

Здесь: 9h – тип записи (конец файла); 03h-количество данных в полях 4-6; 0000h-адрес; FCh-контрольная сумма.