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

 
 
> вызов ф-ции на ассемблере из си.
Faradey
сообщение Apr 5 2007, 16:36
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



есть ф-ция написанная на асме. вот хочу ее вызывать из си.
как ее прикрутить в ИАРе?


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
nvhleb
сообщение Apr 6 2007, 14:46
Сообщение #2





Группа: Новичок
Сообщений: 10
Регистрация: 31-07-06
Пользователь №: 19 211



Вопрос уже обсуждался в

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
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:07
Рейтинг@Mail.ru


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