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

 
 
> присоединение программы на ассемблере(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
KosTTTT
сообщение Aug 28 2014, 09:33
Сообщение #5





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



Цитата(=GM= @ Aug 28 2014, 11:24) *
3) Оформляете ассемблерную подпрограмму в отдельном файле с расширением .S Чуть попозже подготовлю пример оформления.


Мне следует просто вставить код программы в созданный файл .S? Не будет ли при этом отличаться синтаксис от компилятора в AVR Studio? И как быть с файлами .inc, которые я использовал?
Нужно ли при этом оформлять заголовочный файл с прототипом функции, которую я вызову из главной программы на Си. И как мне оформить этот прототип? Не void function (void);?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 28 2014, 09:56
Сообщение #6


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

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



Цитата(KosTTTT @ Aug 28 2014, 13:33) *

Думаю вам стоит всё это прочитать:
http://microsin.net/programming/AVR/mixing...d-asm-code.html
http://www.nongnu.org/avr-libc/user-manual/FAQ.html
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html


Цитата(=GM= @ Aug 28 2014, 13:38) *
ну вызвали вы из си ассемблерную программу
вся программа на АСМ - это не только ассемблерные подпрограммы. У неё есть и глобальные переменные. А стек тут при том что его можно по-разному организовать, можно как в avr-gcc (аппаратный), а можно как в IAR и ICC-AVR с использованием Y-регистра. Как его писатели асм-кода реализовали тоже не известно.
PS: В большинстве своём мне приходилось видеть asm-говнокод - простыню кода на ASM без какого бы то ни было структурирования, и что вы собираетесь вызывать из си?
Когда управление будет возвращено? Что будет с СИ контекстом?

Я понимаю, что вы говорите об идеальной ASM программе, написанной в стиле языка более высокого уровня, но это ваша иллюзия быстро развеется в реальной жизни.
Вы возможно отличный АСМ-программист, съевший не одну собаку, и на текущий момент перешедший/переходящий на Си.
И с высоты прожитых лет знаете как надо писать и как нет. Но таких людей мало. В основном - студенты, которые сразу рвутся в бой и катают простыню.
Я прошу вас, вернитесь к реалиям.

Ваш пример не показателен, т.к. он изначально сделан (я надеюсь) с учётом си-соглашений. А простыня от него очень и очень далека...
Если вы не доверяете моему опыту, предлагаю поставить эксперимент: пусть ТС решит САМ эту задачку и поделится с нами новым для него опытом.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 28 2014, 11:18
Сообщение #7


Ambidexter
*****

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



Всё давно придумано до нас. Повнимательнее посмотрите пример приведенного мною кода. В программе на си организованы секции для данных, так что сишная программа знает их адреса и знает про контекст, а ассемблерная может использовать данные адреса. Также все переменные, используемые в ассемблерной (под)программе как глобальные, определены в сишной программе. Например, 64-битная переменная re0, используемая в подпрограмме.

Далее, я не призываю писать весь код на ассемблере, в настоящее время генерируемый си-код, как правило, всего на 10-50% объемнее ассемблерного кода. Я призываю крепко подумать, прежде чем использовать асм п\п. Лично я не представляю себе как на си перемножить вышеупомянутую 64-битную переменную re0 на другую 64-битную переменную с получением 128-битного результата. Чем биться с сишными извращениями, мне проще написать подпрограмму на ассемблере. Вот это и есть реалистический подход.

Может быть пример и не показателен, это просто пример автору темы, как можно решить вставшую перед ним проблему.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post



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

 


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


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