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

 
 
> Вставка в СИ кода на ассемблере
Яrik
сообщение Jan 8 2007, 21:34
Сообщение #1


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

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Тут (www.atmel.ru/Articles/Atmel13.htm) нашел программу на ассемблере,наз. bcdfp, преобразующая двоичные числа с плавающей точкой, в последовательность (строку) из 8 ASCII-символов, которая включает в себя ASCII-символ знака, шесть ASCII-символов значащих десятичных цифр и ASCII-символ точки. Но у меня его неполучается использоватьэтот код в CodeVisionAVR.
Выдает какието ошибки при компелировании. help.gif

Может, ктото растолкует, что и как, буду весьма благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Potter
сообщение Jan 10 2007, 00:15
Сообщение #2


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

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Собствено в помощь людям которым очень нужно написать асемдлерную функцию в сишном проекте(в IAR-е).

Создаем файл с расширением asm и пристегиваем его к проекту.

В этом файле пишем свою функцию.... К примеру:

//***********************************************
NAME set_int
#include <iom16.h>
PUBLIC set_int
RSEG CODE
EXTERN sinus

set_int:
cpi r16, 0x08
brne opt
clr r16
opt:

inc r16

ret

END set_int
//***********************************************

Теперь как вызвать эту функцию в main.c:

Сначала ее нужно в обьявить в main.c:

//*********************************
extern unsigned char set_int(unsigned char);
//*********************************

А теперь эту функцию "set_int" можно вызывать в любом месте в main.c. К примеру:

//*********************
//Обработчик прерывания по таймер вектору 1.
#pragma vector = TIMER1_OVF_vect
__interrupt void Timer1_interrupt(void){
F1 = set_int(F2);
F2 = F1;
TCNT1 = TIMER1_DELAY; //Перезапуск таймера на новый отчет времени
}
//*********************

Где "F1" и "F2"- глобальные переменныя которые объявленны как unsigned char....
Передоваемое значение функции ("F2") занаосится в r16. Потом с этим значением нужно работать уже в самой асемблерной функции. Передает асемблерная функция то значение которое находится опять же в регистре r16 на момент когда функция закончивает свою работу(т. е. в "F1" сохраняется значение которое на момент окончания функции находилось в регистре r16).

Мне когда-то очень нужно было разобраться как выполнить эту задачу..... Надеюсь что это кому-нибудь поможет. Удачи.

Сообщение отредактировал Potter - Jan 10 2007, 00:19
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2007, 11:07
Сообщение #3


Гуру
******

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



Цитата(Potter @ Jan 9 2007, 23:15) *
Собствено в помощь людям которым очень нужно написать асемдлерную функцию в сишном проекте(в IAR-е).
В ИАРе все подробно расписано в документации. И делается как и положено в "больших" компиляторах с раздельной компиляцией и линковкой. А люди хотят перетащить это в CV, у которого нет понятия модулей, объектных файлов, линковки. Он все файлы склеивает в один с помощью #include, компилирует эту "колбасу", получает один большой ассемблерный файл на весь проект из которого при помощи avrasm (или avrasm32 - не помню, давно смотрел) получает сразу .hex прошивки. При этом в документации создание кусков на асме описано весьма скудно, часть #pragma не описана вообще - о них можно догадаться только просматривая прилагаемые исходники "библиолтек".
В CV асм-вставки делаются так (в свое время полдня убил пока разобрался):
Код
#pragma    asm_function+
void TX_Putchar ( char TX_byte) {
#asm
    LD    R16,Y+    ;// first parameter (TX_byte) passed in [Y]
    RJMP    TX_PUTCHAR
#endasm
}

unsigned int Get_Serial(void) {
#asm     asm_function+

    RCALL    GET_SERIAL
    MOV        R30,R16
    MOV        R31,R17     ;// return unsigned int in R30:R31
    RET
#endasm
}
#pragma    asm_function-
Про то, как передаются параметры и возвращаются значения было описание в документации.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Яrik   Вставка в СИ кода на ассемблере   Jan 8 2007, 21:34
- - Ryzhuk   Привет.. У меня таже проблемка.... Может старожил...   Jan 8 2007, 22:03
|- - Ryzhuk   Может вместе решим эту проблему.... Стучи в аську ...   Jan 8 2007, 23:28
- - beer_warrior   ЦитатаВыдает какието ошибки при компелировании. Во...   Jan 8 2007, 23:42
- - big256   если вы о этом : http://www.atmel.ru/Articles/Atme...   Jan 9 2007, 12:18
- - _Bill   Цитата(Яrik @ Jan 8 2007, 21:34) Тут (www...   Jan 9 2007, 12:55
- - kamedi_clab   в CVAVR по моему вот так вставку АСМ делают: http...   Jan 9 2007, 13:56
- - aleksey_g   Сам пользуюсь этой штучкой под ИАР для "Печат...   Jan 9 2007, 15:21
- - Яrik   ЦитатаМожет вместе решим эту проблему.... Стучи в ...   Jan 9 2007, 21:35
- - Яrik   ЦитатаВо-вторых. Зачем такие половые извращения, к...   Jan 9 2007, 22:05
|- - aleksey_g   Цитата(Яrik @ Jan 9 2007, 21:05) Может, у...   Jan 10 2007, 13:33
|- - aleksey_g   Цитата(Яrik @ Jan 9 2007, 21:05) Может, у...   Jan 10 2007, 13:52
|- - Dog Pawlowa   Цитата(Яrik @ Jan 9 2007, 23:05) ЦитатаВо...   Jan 10 2007, 19:39
- - Яrik   ЦитатаВсе должно быть в документации. Но лучше вст...   Jan 9 2007, 22:17
|- - big256   Цитата(Яrik @ Jan 9 2007, 23:17) C_asm см...   Jan 10 2007, 17:35
- - zorromen   А про #pragma asm_function+ Можно подробнее... ...   Jan 10 2007, 19:02
|- - big256   Цитата(zorromen @ Jan 10 2007, 20:02) А п...   Jan 11 2007, 11:07
- - Яrik   ЦитатаА зачем Вам выводить показания АЦП 10-битног...   Jan 11 2007, 21:37


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

 


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


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