Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вызов ф-ции на ассемблере из си.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Faradey
есть ф-ция написанная на асме. вот хочу ее вызывать из си.
как ее прикрутить в ИАРе?
zltigo
F1 -> Calling assembler routines from C
Faradey
Цитата(zltigo @ Apr 5 2007, 15:49) *
F1



спасибо. помочник.
rumit2000
Цитата(Faradey @ Apr 5 2007, 17:52) *
спасибо. помочник.

А между прочим в хелпе по этому вопросу вполне разумно написано... по крайней мере для MSP430
Faradey
Цитата(rumit2000 @ Apr 5 2007, 16:54) *
А между прочим в хелпе по этому вопросу вполне разумно написано... по крайней мере для MSP430


я не знаю. может быть в для MSP430 и написано, но я не нашел и поэтому спросил, а издеваться не надо не знаете - молчите, знаете - подскажите.
zltigo
Цитата(Faradey @ Apr 5 2007, 15:56) *
но я не нашел...

Поиск в Ctrl+F в документе с вполне очевидным названием EWxxx_CompilerReference.pdf
вполне очевидного словосочетания calling assembler.
Поискать и по этому форуму тоже не сложно.
Задавать очевидные вопросы не дав себе любимому никакого труда разобраться именно это и есть
ИЗДЕВАТЕЛЬСТВО.
Faradey
Цитата(zltigo @ Apr 5 2007, 17:08) *
Поиск в Ctrl+F в документе с вполне очевидным названием EWxxx_CompilerReference.pdf
вполне очевидного словосочетания calling assembler.
Поискать и по этому форуму тоже не сложно.
Задавать очевидные вопросы не дав себе любимому никакого труда разобраться именно это и есть
ИЗДЕВАТЕЛЬСТВО.


неужели столько писать ВАМ не влом, нет чтобы сразу сказать

Add Files... тут выбрать нужный файл *.asm и не забыть в проэкте
extern void myfunc ( ... ); описать ф-цию, чтоб компилятор узнал тип входных данных

но все равно СПАСИБО.
rezident
Цитата(Faradey @ Apr 5 2007, 20:27) *
неужели столько писать ВАМ не влом, нет чтобы сразу сказать

Add Files... тут выбрать нужный файл *.asm и не забыть в проэкте
extern void myfunc ( ... ); описать ф-цию, чтоб компилятор узнал тип входных данных

но все равно СПАСИБО.

Токмо не нужно забывать правила для написания асм-овых функций в ИАРе в части использования регистров для передачи параметров. Ну и
PUBLIC myfunc
добавить, чтобы СИ компилятор не растерялся в поисках асм-овой функции.
Все это как раз в Хелпе описано. И ваш вопрос далеко не оригинален, так что не стоит на RTFM обижаться wink.gif
IgorKossak
Кроме использования регистров следует ещё помнить о стеке данных и его указателе в регистровой паре Y (в случае с AVR).
PUBLIC myfunc помогает скорее линкеру найти эту функцию в море обьектного кода. Компилятор асмовских файлов даже не касается.
nvhleb
Вопрос уже обсуждался в

http://electronix.ru/forum/lofiversion/index.php/t19767.html

От себя могу добавить, что вначале стоит прочитать "AVR034 Mixing C and Assembly Code with.pdf".

Далее нужно создать модуль с расширением *.asm и подключить его у проекту.


Пример модуля обработчика прерываний:


NAME UART_int ; имя

#include "ioavr.h" ; главное не подключать модули, в которых определены C-шные объекты

COMMON INTVEC(1) ; размещаем код в Interrupt Vector Segment

ORG USART_RXC_vect ; по адресу обработчика прерывания
rjmp USART_RXC ; переход на сам обработчик



extern uartRxError, uartESCReceived ; введение переменных, объявленных в другом модуле

RSEG CODE ; размешение программы в сегменте основного кода (RSEG)

USART_RXC:
call SAVE_DATA ; не забываем сохранить используемые регистры
;
; собственно исполняемый код
;
jmp EXIT_INT ; восстанавливаем значения регистров и выходим из прерывания


EXIT_INT:
call RESTORE_DATA
reti


SAVE_DATA:
st -Y, R16
in R16, SREG ; обязательно сохраняем флаги
st -Y, R16
st -Y, R17
ret

RESTORE_DATA:
ld R17, Y+
ld R16, Y+
out SREG, R16 ; восстанавливаем флаги
ld R16, Y+
ret

END


В C-модулях ничего делать не надо.



Если нужно из C-кода вызывать ASM-функции, то после перечитывания топиков "Passing Variables Between C and Assembly Code Functions" и "Calling Assembly Code Functions from a C Program". В C-модулях через extern объявляем вызываемую функцию и вызываем как обычно, а в AMS-модуле ее шарим через PUBLIC:

NAME get_port
#include "ioavr.h"
PUBLIC get_port ; Declare symbols to be exported to C function

RSEG CODE ; This code is relocatable, RSEG
get_port; ; Label, start execution here
in R16,PIND ; Read in the pind value
swap R16 ; Swap the upper and lower nibble
out PORTB,R16 ; Output the data to the port register
ret ; Return to the main function
END
Ahha
Люди добрые, помогите! То ли я идиот, то ли мой англ. безнадежно плох, но просмотр всех рекомендованых апноутов мне не помог побороть проблему прикручивания в IARе (IAR EWAVR 4.21A) асм файлов для вызова их из С кода. Если можно пришлите какой-нибуть простенький проект собраный из асм и С файлов, или разъясните пошагово что куда писать, чтоб асм файл можно было вызвать из С как функцию. Почта: ahha7@mail.ru, советы можно и в асю 213210731.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.