реклама на сайте
подробности

 
 
> присоединение программы на ассемблере(asm) к программе на С
KosTTTT
сообщение Aug 27 2014, 13:42
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 12-08-14
Пользователь №: 82 523



Как присоединить большую программу, написанную в AVR Studio на ассемблере к программе на С? В интернете вроде бы прочел, что надо присоединить объектный файл программы на ассемблере на этапе линковки, но как это сделать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex11
сообщение Aug 27 2014, 17:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Две программы соединить нельзя. Кто-то из них должен быть программой, а кто-то подпрограммой, из нее вызываемой. Обычно на С пишется головная программа, а на ассемблере подпрограмма. В этом случае подпрограмма должна соблюдать некоторые ограничения, накладываемые С-компилятором. Далее, в Вашем случае будут, скорее всего, еще дополнительные сложности, т.к. AVR-студия не имеет своего С-компилятора. Вам нужно найти С-компилятор с линкером, который поймет формат объектного файла, сформированного AVR-студией. Либо транслировать программу, написанную под студию другим ассемблером. Здесь возможны расхождения в синтаксисе и куча правок руками. А в принципе, достаночно линкеру указать два модуля для линковки, и они соединятся.
Go to the top of the page
 
+Quote Post
KosTTTT
сообщение Aug 28 2014, 06:34
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 12-08-14
Пользователь №: 82 523



Объектный файл, сформированный AVR Stuio имеет формат .obj, а компилятор Си, GCC - .o. Я так понял, я не смогу их соединить на этапе линковки?
Кстати не могли бы вы объяснить, как мне в какой-нибудь среде (WinAVR, Eclipse, CVAVR) присоединять готовые объектные файлы, чтобы не компилировать по нескольку раз файлы .с?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 28 2014, 07:24
Сообщение #4


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 Чуть попозже подготовлю пример оформления.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 28 2014, 07:34
Сообщение #5


неотягощённый злом
******

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



Цитата(=GM= @ Aug 28 2014, 11:24) *
Позволю себе прокомментировать..

В первый вариант я вообще не верю, т.к. программа на асме вряд ли написана структурно и она 100% будет портить СИ-контекст, так что можете об этом даже и не мечтать...

Второй вариант самый трудозатратный и лично я не вижу в нём хоть какого-нибудь смысла касательно перепахивания всей программы в таком стиле.
Ну а что касается "ублюдочности" формата асм вставок, так это плата за возможность отдать на откуп распределение регистров ассемблеру-компилятору.
И ни один другой инструмент не может в этом плане сравниться с gcc/gas.

ИМХО вариант 3 самый компромиссный, но придётся сделать нехилый рефакторинг асм кода (замечу, что может оказаться легче сразу на си переписывать вычлененные функ
ции).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016