|
Как сделать смешаный проект?, С *.c и *.asm файлами |
|
|
|
Apr 30 2008, 05:38
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(MrYuran @ Apr 30 2008, 09:01)  А в чём проблема? Проблема в том, что если я тупо включаю в проект .asm файл, то он не транслируется. Цитата(MrYuran @ Apr 30 2008, 09:01)  посмотрите примеры из состава GCC, заодно и мэйк файл готовый можно взять Да где его найти-то? Все что там есть - это demo, largedemo и stdiodemo. И вообще, как-то туго у них с документацией: в gcc.pdf описан чисто С, а в avr-libc-user-manual - стандартные библиотеки. Где описание всего того, что индивидуально именно для AVR? В частности, calling convention - без него нет смысла писать ассемблерные функции.
|
|
|
|
|
Apr 30 2008, 06:38
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ Apr 30 2008, 09:38)  Где описание всего того, что индивидуально именно для AVR? В частности, calling convention - без него нет смысла писать ассемблерные функции. В avr-libc-user-manual. Анатолий. Цитата(777777 @ Apr 30 2008, 09:38)  Да где его найти-то? Все что там есть - это demo, largedemo и stdiodemo. Есть еще asmdemo.
|
|
|
|
|
Apr 30 2008, 09:30
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(777777 @ Apr 30 2008, 12:19)  Подозреваю что это транслятор, который берет промежуточный ассемблерный файл, который получается после компиляци C-файла. после компиляции с-файла получается объектный файл, не имеющий ничего общего с ассемблером Цитата PS. А без мейкфайла, непосредственно в IDE нельзя указать что файл является ассемблерным? Какая ИДЕ? мэйк-файл нужен по любому, только формируете его либо вы (как вам надо), либо оболочка (как посчитает нужным) на ассемблерность файла указывает его расширение (.s)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 30 2008, 09:59
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(MrYuran @ Apr 30 2008, 13:30)  после компиляции с-файла получается объектный файл, не имеющий ничего общего с ассемблером Не факт. Помнится, в юниксе на ЭВМ  СМ-4 c-шный компилятор создавал сначала ассемблерный файл, причем именно с расширением .s, а из него уже получал объектный. Скоре всего gcc тоже генерирует сначала ассемблерный файл и сразу передает его транслятору. Цитата(MrYuran @ Apr 30 2008, 13:30)  Какая ИДЕ? мэйк-файл нужен по любому, только формируете его либо вы (как вам надо), либо оболочка (как посчитает нужным) Да это понятно. Я и имел в виду - генерировать его из ИДЕ с помощью флажков. Впрочем, мне это уже удалось Цитата(MrYuran @ Apr 30 2008, 13:30)  на ассемблерность файла указывает его расширение (.s) Увы. Кроме того, удалось догадаться о наличии в этом ассемблере директивы .global
|
|
|
|
|
Apr 30 2008, 10:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(777777 @ Apr 30 2008, 12:19)  но главная проблема, которую я увидел - ассемблерный файл транслируется вовсе не AVR-овским ассемблером. Хм... а каким? Возможно, вы имели ввиду атмеловский AvrAssembler? Так и не должен - у avr-gcc есть собственный ассемблер, с собственным синтаксисом. Документация в Doc/binutils/as. Цитата(777777 @ Apr 30 2008, 12:59)  Не факт. Да, это не факт. Это больше, чем факт - так оно и есть на самом деле. gcc в обычном режиме передает ассемблерный текст от компилятора к ассемблеру через pipe, т.е. файл на диске не создается. Вы можете попросить его создать такой файл, но это уже из другой оперы. А выходом уже ассемблера является объектный файл, но поскольку промежуточное ассемблирование вызывается неявно, снаружи выглядит так, что выходом компилятора является объектный файл. Поправьте меня кто-нибудь, если я не прав.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 30 2008, 11:23
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Сергей Борщ @ Apr 30 2008, 14:34)  Хм... а каким? Возможно, вы имели ввиду атмеловский AvrAssembler? Ну да, конечно. Цитата(Сергей Борщ @ Apr 30 2008, 14:34)  Так и не должен - у avr-gcc есть собственный ассемблер, с собственным синтаксисом. И наверное с собственным форматом объектных файлов. Цитата(Сергей Борщ @ Apr 30 2008, 14:34)  Документация в Doc/binutils/as. О, вот это ценная вещь. И директива .global там действительно есть
|
|
|
|
|
May 3 2008, 20:23
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Пишу так Код EXPORT Test EXTERN func1
AREA |.text|, CODE, READONLY
Test LDR R0, =func1 BX R0
END Линкер говорит что не может найти func1 , хотя вот так Код EXPORT Test EXTERN _Z5func1v
AREA |.text|, CODE, READONLY
Test LDR R0, =_Z5func1v BX R0
END работает, но это бред. Как правильно? Компилер RV
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
May 4 2008, 05:46
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(Сергей Борщ @ Apr 30 2008, 14:34)  Да, это не факт. Это больше, чем факт - так оно и есть на самом деле. gcc в обычном режиме передает ассемблерный текст от компилятора к ассемблеру через pipe, т.е. файл на диске не создается. Наблюдал во время сборки проекта с помощью arm-elf-gcc в папке, расположенной в Documents and Settings создаётся ассемблерный файл наборсимволов.S Работаю в винде ХР
|
|
|
|
|
May 4 2008, 05:51
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(InsolentS @ May 4 2008, 01:18)  Хмм..в случае с Си действительно работает. А как же тогда смешивать асм с С++ кодом? extern "C" int funciya_is_cpp_faila(int); или extern "C" { int funciya_is_cpp_faila(int); } Почитайте про манглинг, extern "C" и вообще про C++.
|
|
|
|
|
May 4 2008, 11:46
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ May 4 2008, 15:03)  В нем для обращения к памяти программ нужно в два регистра записать адрес программной памяти, умноженный на 2, в один регистр младшую часть этого выражения, а в другой старшую. А компилятор WinAVR ругается н алюбые выражения над пеемещаемыми символами. Опишите задачу которую хотите решить, приведите код который у вас не работает и ошибки котрые выдает ассемблер/линкер. Анатолий.
|
|
|
|
|
May 4 2008, 13:02
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(aesok @ May 4 2008, 15:46)  Опишите задачу которую хотите решить, приведите код который у вас не работает и ошибки котрые выдает ассемблер/линкер. Задача простая: получить данные из памяти программ: Код ldi r30, (Table*2)&0xff ldi r31, ((Table*2)>>8)&0xff lpm
Table: .byte 1, 2, 3 Результат: Error: invalid sections for operation on `Tbl' and `L0' Возможно для gnu-того ассемблера такие таблицы следует помещать в какую-то особенную секцию, но в хелпе я ничего не нашел.
|
|
|
|
|
May 4 2008, 19:42
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
GNU as для AVR поддерживает байтовую адресацию флеша, поэтому умножать на 2 не надо. Для старшего/младшего байта есть модификаторы: Код ldi r30, lo8(Table) ldi r31, hi8(Table) lpm Если нужен адрес функции, то тогда надо бы делить на два, есть модификатор pm() и pm_lo8()/pm_hi8() Сверх этого мне нужны были только разности перемещаемых величин для получения абсолютной (длина таблицы) или сумма/разность перемещаемой и абсолютной величин для получения смещённого относительно метки значения. Больше мне не было нужно, даже не знаю, насколько вольно он позволяет жонглировать перемещаемыми величинами.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 29 2008, 13:25
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Пока большинство с успехом пользуется С, у меня проблема на проблеме.  Пользуюсь AVRstudio + GCC plugin Цитата AVR Studio 4.13.571 Service Pack 2 Plugins: AvrPluginAvrAsmObject 1, 0, 0, 46 AvrPluginavrgccplugin 1, 0, 0, 9 Пишу обработчик прерывания на асме Код .section .text .global TIMER1_OVF_vect TIMER1_OVF_vect: push r15 ..........do something....... pop r15 reti Плагин автоматом рожает Makefile, который меня вроде устраивает. Прилагаю на всякий случай. После компиляции наблюдаю присутствие вектора _vector_20 в файле *.lss Все нормально? Хрен! При запуске в студии не могу отладить свое прерывание. Тамошний дизассемблер говорит, что такого вектора нет! Кто собирал смешанные проекты с отладкой на последней версии студии - отзовитесь! Нормально ли там получается отлаживать асмы? З.Ы. Проблему решил костылем: Код // это в ассемблерном файле .section .text .global tov1_proc tov1_proc: push r15 ................. pop r15 ret
//это в сишном ISR(TIMER1_OVF_vect,ISR_NAKED) { tov1_proc(); reti(); } Как бы это покультурнее выразиться ...
|
|
|
|
|
May 29 2008, 15:33
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(_Pasha @ May 29 2008, 17:25)  Плагин автоматом рожает Makefile, который меня вроде устраивает. Прилагаю на всякий случай. После компиляции наблюдаю присутствие вектора _vector_20 в файле *.lss Все нормально? Хрен! При запуске в студии не могу отладить свое прерывание. Тамошний дизассемблер говорит, что такого вектора нет! вызов _vector_20 при этом в __vectors есть ? если есть, то для отладки по асм коду ищите опцию AS -gstabs если нету то и не все OK ... проще всего выложите полный(минимальный) проект.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|