|
присоединение программы на ассемблере(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, 09:33
|
Группа: Новичок
Сообщений: 4
Регистрация: 12-08-14
Пользователь №: 82 523

|
Цитата(=GM= @ Aug 28 2014, 11:24)  3) Оформляете ассемблерную подпрограмму в отдельном файле с расширением .S Чуть попозже подготовлю пример оформления. Мне следует просто вставить код программы в созданный файл .S? Не будет ли при этом отличаться синтаксис от компилятора в AVR Studio? И как быть с файлами .inc, которые я использовал? Нужно ли при этом оформлять заголовочный файл с прототипом функции, которую я вызову из главной программы на Си. И как мне оформить этот прототип? Не void function (void);?
|
|
|
|
|
Aug 28 2014, 09:56
|

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

|
Цитата(KosTTTT @ Aug 28 2014, 13:33)  Думаю вам стоит всё это прочитать: http://microsin.net/programming/AVR/mixing...d-asm-code.htmlhttp://www.nongnu.org/avr-libc/user-manual/FAQ.htmlhttp://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 программе, написанной в стиле языка более высокого уровня, но это ваша иллюзия быстро развеется в реальной жизни. Вы возможно отличный АСМ-программист, съевший не одну собаку, и на текущий момент перешедший/переходящий на Си. И с высоты прожитых лет знаете как надо писать и как нет. Но таких людей мало. В основном - студенты, которые сразу рвутся в бой и катают простыню. Я прошу вас, вернитесь к реалиям. Ваш пример не показателен, т.к. он изначально сделан (я надеюсь) с учётом си-соглашений. А простыня от него очень и очень далека... Если вы не доверяете моему опыту, предлагаю поставить эксперимент: пусть ТС решит САМ эту задачку и поделится с нами новым для него опытом.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 28 2014, 11:18
|

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

|
Всё давно придумано до нас. Повнимательнее посмотрите пример приведенного мною кода. В программе на си организованы секции для данных, так что сишная программа знает их адреса и знает про контекст, а ассемблерная может использовать данные адреса. Также все переменные, используемые в ассемблерной (под)программе как глобальные, определены в сишной программе. Например, 64-битная переменная re0, используемая в подпрограмме.
Далее, я не призываю писать весь код на ассемблере, в настоящее время генерируемый си-код, как правило, всего на 10-50% объемнее ассемблерного кода. Я призываю крепко подумать, прежде чем использовать асм п\п. Лично я не представляю себе как на си перемножить вышеупомянутую 64-битную переменную re0 на другую 64-битную переменную с получением 128-битного результата. Чем биться с сишными извращениями, мне проще написать подпрограмму на ассемблере. Вот это и есть реалистический подход.
Может быть пример и не показателен, это просто пример автору темы, как можно решить вставшую перед ним проблему.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
KosTTTT присоединение программы на ассемблере(asm) к программе на С Aug 27 2014, 13:42   demiurg_spb Цитата(=GM= @ Aug 28 2014, 11:24) Позволю... Aug 28 2014, 07:34    =GM= Цитата(demiurg_spb @ Aug 28 2014, 07:34) ... Aug 28 2014, 08:22     demiurg_spb Цитата(=GM= @ Aug 28 2014, 12:22) Не так ... Aug 28 2014, 09:11      =GM= Ерунда на постном масле, причём здесь стек? Ну выз... Aug 28 2014, 09:38      demiurg_spb Цитата(=GM= @ Aug 28 2014, 15:18) Всё дав... Aug 28 2014, 11:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|