Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Соглашения по передаче параметров
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
RRaptor
Решил вот немного подучить ARM - ассемблер и в плане тренировки написать быструю функцию strlen. В связи с этим появилась одна проблема, как корректно передать/принять параметры. Не нашел где это описано ни в хелпе к CrossStudio ни ARM Architecture. Может кто уже чем то таким занимался. В идеале хотелось бы получить пример типа

Код
uint32_t AddOne(uint32_t data)
{
  asm("LDR R1,[R3]");            // по идее какой то регистр должен быть указателем стека, какой?
  asm("ADD  R1,R1,#0x01");  // прибавляем 1
  asm("STR R0,[R3]");           // возвращение через стек
  asm("MOV R0,R1");            // или через регистр
}

насколько есть смысл писать функции в таком виде, может лучше описать в отдельном asm файле, но как в нем указать что эта функция будет вызываться из С (что то типа extrn/public в ассемблере для процесоров Intel).

И еще, как заставить CrossStudio создавать asm исходники из C/C++, тогда бы я и сам посмотрел
как он генерирует код для вызова функций.
klen
Цитата(RRaptor @ Aug 18 2006, 13:29) *
И еще, как заставить CrossStudio создавать asm исходники из C/C++, тогда бы я и сам посмотрел
как он генерирует код для вызова функций.

А дизасемлер че, не катит? Написал функцию на С, и смотри че компиллер сгенерил. А ваще то по умолчанию вызывающий код должен засовыват в стек параметры начиная с конца, а код функции перед возвратом подымать стек обратно. Но это в стандарте, но через регистры быстрее.
RRaptor
Цитата(klen @ Aug 18 2006, 14:50) *
А дизасемлер че, не катит? Написал функцию на С, и смотри че компиллер сгенерил.

Простите за назойливость, а под дизассемблером понимается отдельная программа или он встроен в CrossStudio? Если первое, то название plz (или где можно взять), если второе, то как его включить, у меня генерятся только elf и hex файлы.
Настройки проекта смотрел, настройки среды тоже, вроде ничего похожего нет.
Rst7
Обычно на ARM - первые четыре параметра R0-R3 (если по размеру параметр помещается в регистр), остальное в стеке. Возврат - R0/R1. Стек подметает _ВЫЗЫВАЮЩАЯ_ функция...
klen
Цитата(Rst7 @ Aug 18 2006, 15:34) *
Обычно на ARM - первые четыре параметра R0-R3 (если по размеру параметр помещается в регистр), остальное в стеке. Возврат - R0/R1. Стек подметает _ВЫЗЫВАЮЩАЯ_ функция...

По мойму это не относится к АРМ, это относится к компиллеру C/C++. Это он решает как и где ему эпилоги и прогоги ставить. Стандарт С говрит едино как я уже упомянул. А применительно к архитектуре это компиллер пишут кто как сам горазд для лучшей оптимизации.

2_RRaptor.
Дизасемблер встроен.
1. запускаете проект через провод или в симуляторе, нажимаете кнопочку InterLeaved mode
aaarrr
Цитата(RRaptor @ Aug 18 2006, 13:29) *
насколько есть смысл писать функции в таком виде, может лучше описать в отдельном asm файле

Однозначно лучше в отдельном asm-файле.

Цитата(RRaptor @ Aug 18 2006, 13:29) *
В связи с этим появилась одна проблема, как корректно передать/принять параметры. Не нашел где это описано ни в хелпе к CrossStudio ни ARM Architecture.

За информацией о передаче параметров при вызове лучше всего обратиться к первоисточнику.
RRaptor
Цитата(aaarrr @ Aug 18 2006, 16:38) *
За информацией о передаче параметров при вызове лучше всего обратиться к первоисточнику.

То что надо, спасибо большое.
Alex03
Цитата(RRaptor @ Aug 18 2006, 15:29) *
И еще, как заставить CrossStudio создавать asm исходники из C/C++, тогда бы я и сам посмотрел
как он генерирует код для вызова функций.


В CrossStudio в Project Explorer открываете дерево (нажимаете плюсик) для соответствующего исходника, там открываете Output Files, и кликаете Соответствующий *.o файл. И будет Вам счастье.
Или для всего проекта соответствующий Output Files->prjjectname.elf

Можон по другому. CrossStudio пользует GCC.
Т.е. можно ручками получить ASM файлик из С-исходника
gcc -S ....

Но ИМХО форматы и способы передачи параметров зависят от:
- Компилятора
- опций компилятора (оптимизация и т.д.)
- языка программирования. С, С++ и т.д.
- количества и типов самих параметров.
- всяких модификаторов и атрибутов. (типа extern "С" и т.п.)
- да от версии компилятора тоже

Т.ч. в ряде случаев "выгоднее" писать С-функцию с ASM-вставкой.
GCC-встроенный_ASM позволяет описывать входные-выходные параметры для ASM-вставок,
а также использовать абстрактрые регистры которые gcc сам заменит на "свободные", и если надо сохранит/восстановит используемые регистры в прологе/эпилоге.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.