Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
686.docx
Скачиваний:
85
Добавлен:
24.04.2019
Размер:
6.68 Mб
Скачать

5.2.10 Использование меток

Внутри функции можно определять метки вида nnnn$, где n – число от 0 до

100. Метки, используемые в языке Си, не видны внутри ассемблерных вставок

и наоборот. Метки в ассемблерных вставках внутри разных функций также не

видны друг для друга.

foo() {

/* Некоторый код на Си */

_asm

; Некоторый ассемблерный код

ljmp 0003$

_endasm;

/* Еще код на Си */

clabel: /* Встроенный ассемблер не видит эту метку */

_asm

0003$: ; Эта метка доступна только из встроенного ассемблера

_endasm ;

/* Еще код на Си */

}

5.2.11 Директива __naked

Директива __naked позволяет исключить генерацию вводной части

функции. Предполагается, что за сохранение контекста отвечает программист.

volatile data unsigned char counter;

void simpleInterrupt(void) __interrupt (1)

{

counter++;

}

void nakedInterrupt(void) __interrupt (2) __naked

{

_asm

inc _counter ;Инкремент не меняет флагов, нет необходимости сохранять

;psw

reti; Неоходимо явно указывать reti

_endasm;

}

Без __naked получается такой код:

_simpleInterrupt:

push acc

push b

push dpl

push dph

push psw

mov psw,#0x00

inc _counter

pop psw

pop dph

229

pop

pop

pop

reti

dpl

b

acc

С __naked код выглядит так:

_nakedInterrupt:

inc _counter

reti

5.2.12 Формат Intel hex

Intel HEX – формат файла. Основным отличием этого формата от таких

монстров, как ELF и COFF является крайняя простота. Формат позволяет

хранить только образ памяти. Ни о каком перемещаемом коде и возможности

хранения объектных файлов в этом формате речи не идет.

В настоящий момент этот формат в основном используется при

программировании встроенных систем. Большинство компиляторов и линкеров

умеют выдавать загрузочный модуль в этом формате. Строки файла

представляют собой текстовые записи, в которых закодированы адреса

расположения, команды и данные в шестнадцатеричной системе счисления.

Изначально, HEX формат использовался для работы с перфоленточными

загрузчиками.

В

настоящее

время

HEX

формат

используют

для

программирования различных контроллеров и связи с программаторами ППЗУ.

Каждую строку в HEX файле называют записью. Она состоит из

следующих элементов:

 Двоеточие (:).

 Число байтов данных, содержащихся в этой записи. Занимает один байт

(две

шестнадцатеричных

цифры),

что

соответствует

0…255

в

десятичной системе.

 Начальный адрес блока записываемых данных – 2 байта. Этот адрес

определяет абсолютное местоположение блока в EPROM.

 Один байт, обозначающий тип записи.

o

o

o

o

0x00 – блок данных;

0x01 – конец файла;

0x02 – адрес сегмента (см. архитектуру процессора Intel x86);

0x03 – стартовый адрес сегмента (см. архитектуру процессора Intel

x86);

o 0x04 – старшая часть линейного (32-разрядного) адреса;

o 0x05 – стартовый адрес, старшая часть линейного (32-разрядного)

адреса.

 Байты данных (их число указывается в поле 2).

230

 Последний байт в записи является контрольной суммой. Если сумма

всех байтов в строке (без учёта переноса) равняется 00, строка считана

правильно.

 Строка заканчивается стандартной парой CR/LF (0Dh 0Ah).

 Файл всегда завершается командой 01, (получается запись вида

«:00000001FF»).

Пример HEX-файла:

:10010000214601360121470136007EFE09D2190140

:100110002146017EB7C20001FF5F16002148011988

:10012000194E79234623965778239EDA3F01B2CAA7

:100130003F0156702B5E712B722B732146013421C7

:00000001FF

Недостатки формата:

 Ненадежный контрольный код (вероятность ошибки 1/256).

 Нет суммарного контрольного кода для всего файла.

 Получается большой файл при HEX кодировании, что отрицательно

сказывается на скорости передачи файлов в контроллер.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]