Соглашение о вызове функций для процессоров семейства NeuroMatrix — КиберПедия 

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Соглашение о вызове функций для процессоров семейства NeuroMatrix

2022-10-05 31
Соглашение о вызове функций для процессоров семейства NeuroMatrix 0.00 из 5.00 0 оценок
Заказать работу

Общие сведения

Сведения о размерах и выравнивании базовых типов данных С++ приведены в таблице 5.1.

Таблица 5.1 - Размеры и выравнивания базовых типов данных C++

Имя типа Размер в словах процессора Количество значимых бит Выравнивание типа данных в памяти
char 1 8 1
short 1 16 1
int 1 32 1
long 2 64 2
void * 1 32 1
float 1 32 1
double 2 64 2
long double 2 64 2

Замечание

Размер типа данных совпадает с выравниванием данного типа в памяти.

Обращение в память для чтения 64-х битного длинного слова возможно только по четному адресу. Вызов функции возможен, только когда регистр указатель стека имеет четное значение.

Передаваемые параметры функций

Все параметры функции передаются через стек. Для базовых типов данных в стеке передается сам параметр. Для структурных типов данных (структуры, классы, объединения) в стеке передается указатель на структуру.

Компилятор может порождать дополнительные, неявные параметры для функций. Для функций, возвращающих структурный тип данных, добавляется параметр - указатель на область стека в которой располагается структура. Если у функции имеется такой параметр, то он предшествует всем остальным явным и неявным параметрам. Для функций членов класса компилятор порождает неявный параметр - указатель на объект класса (this). Такой параметр предшествует всем явным параметрам. Если у функции имеется два неявных параметра - указатель на возвращаемую структуру и указатель this, то первым параметром является указатель на возвращаемую структуру, вторым указатель this, затем идут явные параметры.

Параметры размещаются в стеке, начиная с последнего, т.е., первый параметр имеет наибольший адрес, последний параметр имеет наименьший адрес.

Выравнивание параметров в памяти соответствует обычному выравниванию переменных такого типа. При этом в стеке могут образовываться неиспользуемые места. Такие неиспользуемые места имеют размер 1 слово и располагаются по четным адресам. Поскольку, при выполнении инструкции перехода к подпрограмме, указатель стека должен иметь четное значение, выравнивание параметров производится относительно места в стеке, где располагаются PC и PSW при переходе к подпрограмме.

Возвращаемые функцией значения

Функция возвращает значение в регистрах. Значения типов - char, short, int, float возвращаются в регистре gr7. Значения типов long, double, long double возвращаются в регистрах gr6, gr7, причем в регистре gr6 находится старшая часть значения, а в регистре gr7 - младшая. Значения указательных типов (преобразуемых к void *) возвращаются в регистре ar5. Если функция возвращает значение структурного типа, то в регистре ar5 возвращается указатель на структуру. Следует отметить, что возвращаемая структура может располагаться в стеке как ниже, так и выше вершины стека.

Используемые и сохраняемые при вызове функции регистры

Соглашение о вызове функций регламентирует обращение только с регистрами ar0-ar7, gr0-gr7:

· Значения регистров ar0-ar4, ar6, gr0-gr5 сохраняются.

· Значения регистров ar5 и gr7 не сохраняются.

· Значение регистра gr6 сохраняется в том случае, если он не используется для возврата части длинного значения.

· Регистр ar7 или sp имеет специальной значение указателя на вершину системного стека и после возврата из функции должен иметь прежнее значение.

Действия функций с другими регистрами (не входящими в число ar0-ar7, gr0-gr7) не регламентируются данным соглашением.

Директивы

Нестандартные макросы

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

Имена встроенных макросов запрещено использовать в директивах define, undef.

Следует отметить, что какие-либо иные реализации Си++ (компиляторы других компаний) могут содержать одноименные нестандартные встроенные макросы, причем их семантика и возвращаемое значение почти наверняка будут отличаться от принятых в нашем компиляторе. Вероятность этого невелика, но она существует. Поэтому если требуется писать потенциально переносимый код, и при этом пользоваться нестандартными макросами, мы рекомендуем такой подход:

#ifdef __ISCPP__/* здесь пользуемся нестандартными макросами*/#endif

__ISCPP__

Раскрывается в целый десятичный литерал, обозначающий версию компилятора (сейчас 300). Этот макрос позволяет определить, является ли компилятор, который обрабатывает исходный файл, компилятором C/С++ производства нашей компании. В таком случае этот макрос определен и расширяется в номер версии компилятора (десятичный литерал; например, 1234 для версии 12.34). При трансляции другим компилятором, этот макрос, скорее всего, не будет определен. Поэтому можно использовать директивы #ifdef/#ifndef, чтобы при обработке нашим компилятором использовался один вариант исходного текста, а при трансляции любым другим компилятором – другой.

__NM__

Раскрывается в целый десятичный литерал равный 1.

Этот макрос позволяет определить, что целевой платформой, для которой компилируется исходный текст, является микропроцессор NeuroMatrix.

__NM6405__

Раскрывается в целый десятичный литерал равный 1, если компилятор был запущен с опцией -6405.

Этот макрос позволяет определить, что целевой платформой, для которой компилируется исходный текст, является микропроцессор NeuroMatrix6405.

5.2.2 Директива _asm (ассемблерные вставки)

Иногда появляется необходимость использовать в теле программы написанной на C/C++ ассемблерные инструкции. Синтаксис ассемблерных вставок следующий:

_asm {    // код на ассемблере}

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

· вместо имени глобальной переменной подставляется соответствующая ей метка

· имени функции подставляется соответствующая ей метка

· вместо имени локальной переменной текущей функции подставляется её смещение относительно указателя на окно стека (frame pointer) функции

Открытие/закрытие секций во встроенном ассемблере запрещено. Определение и использование меток разрешено, но первым символом в имени метки не должна быть латинская заглавная буква ‘L’. Также не рекомендуется определять метки, имя которых начинается с символа подчёркивания (‘_’), т.к. это имя может совпасть с меткой, соответствующей какой-либо из функций, написанных на C/C++ (пользовательской или библиотечной). Все макросредства и директивы разрешены.

Использование встроенного ассемблера разрешено только внутри тела функций.


 

Ключевые слова

В реализации данного компилятора добавлены несколько новых ключевых слов:

__int64 _asm __asm  

Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.