|
присоединение программы на ассемблере(asm) к программе на С |
|
|
|
Aug 27 2014, 13:42
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-08-14
Пользователь №: 82 523

|
Как присоединить большую программу, написанную в AVR Studio на ассемблере к программе на С? В интернете вроде бы прочел, что надо присоединить объектный файл программы на ассемблере на этапе линковки, но как это сделать?
|
|
|
|
|
 |
Ответов
|
Aug 27 2014, 17:08
|
Гуру
     
Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965

|
Две программы соединить нельзя. Кто-то из них должен быть программой, а кто-то подпрограммой, из нее вызываемой. Обычно на С пишется головная программа, а на ассемблере подпрограмма. В этом случае подпрограмма должна соблюдать некоторые ограничения, накладываемые С-компилятором. Далее, в Вашем случае будут, скорее всего, еще дополнительные сложности, т.к. AVR-студия не имеет своего С-компилятора. Вам нужно найти С-компилятор с линкером, который поймет формат объектного файла, сформированного AVR-студией. Либо транслировать программу, написанную под студию другим ассемблером. Здесь возможны расхождения в синтаксисе и куча правок руками. А в принципе, достаночно линкеру указать два модуля для линковки, и они соединятся.
|
|
|
|
|
Aug 28 2014, 06:34
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-08-14
Пользователь №: 82 523

|
Объектный файл, сформированный AVR Stuio имеет формат .obj, а компилятор Си, GCC - .o. Я так понял, я не смогу их соединить на этапе линковки? Кстати не могли бы вы объяснить, как мне в какой-нибудь среде (WinAVR, Eclipse, CVAVR) присоединять готовые объектные файлы, чтобы не компилировать по нескольку раз файлы .с?
|
|
|
|
|
Aug 28 2014, 07:24
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Есть несколько вариантов объединения. 1) Самый простой - можно объединить на уровне хекс-файлов. Компилируете ассемблерную подпрограмму (или программу в общем случае) с определенного адреса, а в сишной программе указываете адрес вызова (или перехода) перехода на данный адрес. Прошивки можно объединить на уровне хекс-текста, или прошить независимо, не стирая кусок, прошитый первым. 2) Оформляете ассемблерную подпрограмму в стиле, понятном компилятору cи, скажем, winavr. Ну там есть мощные ограничения, и вообще ублюдочно сделано на уровне компилятора. Вот яркий пример "ублюдочности" Код void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0) { asm volatile( "eor r18, r18 ;r18<-0" "\n\t" "eor r19, r19 ;r19<-0" "\n\t" "1:" "\n\t" "add r18, %0;1 cycle" "\n\t" "adc r19, %1;1 cycle" "\n\t" "adc %A3, %2;1 cycle" "\n\t" "lpm ;3 cycles" "\n\t" "out %4, __tmp_reg__;1 cycle" "\n\t" "sbis %5, 2;1 cycle if no skip" "\n\t" "rjmp 1b ;2 cycles. Total 10 cycles" "\n\t" : :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR)) :"r18", "r19" ); } 3) Оформляете ассемблерную подпрограмму в отдельном файле с расширением .S Чуть попозже подготовлю пример оформления.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 28 2014, 07:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(=GM= @ Aug 28 2014, 11:24)  Позволю себе прокомментировать.. В первый вариант я вообще не верю, т.к. программа на асме вряд ли написана структурно и она 100% будет портить СИ-контекст, так что можете об этом даже и не мечтать... Второй вариант самый трудозатратный и лично я не вижу в нём хоть какого-нибудь смысла касательно перепахивания всей программы в таком стиле. Ну а что касается "ублюдочности" формата асм вставок, так это плата за возможность отдать на откуп распределение регистров ассемблеру-компилятору. И ни один другой инструмент не может в этом плане сравниться с gcc/gas. ИМХО вариант 3 самый компромиссный, но придётся сделать нехилый рефакторинг асм кода (замечу, что может оказаться легче сразу на си переписывать вычлененные функ ции).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 28 2014, 08:22
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(demiurg_spb @ Aug 28 2014, 07:34)  Позволю себе прокомментировать.. В первый вариант я вообще не верю, т.к. программа на асме вряд ли написана структурно и она 100% будет портить СИ-контекст, так что можете об этом даже и не мечтать... Да ладно :-) С какой стати она будет портить си-контекст, который находится в пзу? Конечно, многое зависит от функциональности данной подпрограммы, и как она связана со всем остальным. Возьмём какой-нибудь пример, скажем, надо сделать два мака над 1000000 выборок и результат положить в две 8-байтные ячейки. Ассемблерная программа берет данные с АЦП, перемножает с синусом и косинусом из таблицы, кладёт результат в определенное место в озу и завершает работу. Сишная программа знает откуда взять результат, там место зарезервировано, и берет его. Вот и всё.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
KosTTTT присоединение программы на ассемблере(asm) к программе на С Aug 27 2014, 13:42     demiurg_spb Цитата(=GM= @ Aug 28 2014, 12:22) Не так ... Aug 28 2014, 09:11      =GM= Ерунда на постном масле, причём здесь стек? Ну выз... Aug 28 2014, 09:38   KosTTTT Цитата(=GM= @ Aug 28 2014, 11:24) 3) Офор... Aug 28 2014, 09:33    demiurg_spb Цитата(KosTTTT @ Aug 28 2014, 13:33)
Дум... Aug 28 2014, 09:56     =GM= Всё давно придумано до нас. Повнимательнее посмотр... Aug 28 2014, 11:18      demiurg_spb Цитата(=GM= @ Aug 28 2014, 15:18) Всё дав... Aug 28 2014, 11:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|