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

 
 
 
Reply to this topicStart new topic
> uVision: Ассемблер в Си-программе?!, Как вставить Асм в СИ!
amoralex
сообщение May 12 2005, 07:57
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 21-04-05
Пользователь №: 4 363



Господа, а как вставить ассемблерный кусочек кода (обработка прерывания отпимизированная) в Си-программу?

Стандартный asm {} не срабатывает...

Документация по КейлСи в отношении ассемблера тоже путанная, я еще по крайней мере вразумительного ничего не нашел там...

Заранее спасибо.
Go to the top of the page
 
+Quote Post
elserge
сообщение May 12 2005, 08:18
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 29-04-05
Из: Брест
Пользователь №: 4 612



#pragma asm
/* ASM */
#pragma endasm

но Keil из исходника с ассемблерными вставками генерит только SRC файл, который потом через ассемблер пускаешь, см. #pragma SRC

Может удобней при линковке подставлять заранее подготовленый obj-модуль обработчика прерывания, написанный на ASM.
Go to the top of the page
 
+Quote Post
amoralex
сообщение May 12 2005, 08:46
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 21-04-05
Пользователь №: 4 363



Спасибо!

Получилось!!! a14.gif

Но теперь симулятор отказывается работать... хм... maniac.gif
Go to the top of the page
 
+Quote Post
elserge
сообщение May 12 2005, 08:57
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 29-04-05
Из: Брест
Пользователь №: 4 612



Подробнее...
Go to the top of the page
 
+Quote Post
amoralex
сообщение May 12 2005, 10:23
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 21-04-05
Пользователь №: 4 363



Когда запускаю симуляцию, то выплавает Окно Дизассембериванного кода и ошибка в окошке Command: acces violation at <адрес>
Go to the top of the page
 
+Quote Post
Miron
сообщение May 12 2005, 10:35
Сообщение #6


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

Группа: Validating
Сообщений: 149
Регистрация: 11-02-05
Из: Рязань
Пользователь №: 2 574



можно сделать и так:

делаем асм модуль в отдельном файле и включаем его в проект

;*************************************************************
;** Процедура на АСМ
;*************************************************************
NAME PR_messaging_420

PUBLIC OUT_4_20

EXTRN DATA (Buf_ADSP) ;** Внешняя переменная

PROG SEGMENT CODE ì
RSEG PROG
;***************************************************************
;***************************************************************
OUT_4_20: mov a,Buf_ADSP
....
.....

ret


в си модуле


data unsigned short Buf_ADSP; //та самая переменная что доступна в асм

extern void OUT_4_20(); //обявляем прототип функции


void main(void)
{OUT_4_20(); //вызываем
}

можно также передать и принять даные в /из асм
тогда прототип
extern char OUT_4_20(char);
в этом случае параметры будут передаваться через
регистры рабочего банка в help подробно все описани
Go to the top of the page
 
+Quote Post
elserge
сообщение May 12 2005, 11:33
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 29-04-05
Из: Брест
Пользователь №: 4 612



Цитата(amoralex @ May 12 2005, 13:23)
Когда запускаю симуляцию, то выплавает Окно Дизассембериванного кода и ошибка в окошке Command: acces violation at <адрес>
*


Насколько я понял, у тебя uVision слетает, когда ты вызываешь Debug Session. Извини, в uVision совсем слаб, хотя попробуй другую версию, или может модуль симуляции (dll) от другой версии.
Go to the top of the page
 
+Quote Post
Stas
сообщение May 12 2005, 12:15
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 464
Регистрация: 1-10-04
Из: Челябинск
Пользователь №: 751



Если была в *.C файле *.ASM вставка, то отладка идет по *.SRC файлу, а он автоматом не открывается. Открой его через File->Open, он имеет то же название что и исходник, но с расширением .src. Там можно и смотреть какие регистры использует компилятор для передачи параметров в функции написанные на ассемблере, ставить точки остановки и т.п.
Go to the top of the page
 
+Quote Post
amoralex
сообщение May 12 2005, 19:36
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 21-04-05
Пользователь №: 4 363



Спасибо, буду развлекаться biggrin.gif
Go to the top of the page
 
+Quote Post
Yra
сообщение Jun 13 2005, 13:48
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 396
Регистрация: 22-10-04
Из: Воронеж
Пользователь №: 962



#pragma asm
/* ASM */
#pragma endasm

И не забыть в свойствах данного файла проставить галочки
Generate Assembler SRC file
Assembler SRC file

- вроде всё работает


--------------------
всё можно наладить, если достаточно долго вертеть в руках /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Krom
сообщение Jul 5 2005, 11:00
Сообщение #11


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

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Цитата(Miron @ May 12 2005, 13:35)
можно сделать и так:

делаем асм модуль в отдельном файле и включаем его в проект .....

*


Вынести подобные функции в отдельную библиотеку на ассемблере самый правильный путь - меньше будет геммороя, если вдруг понадобится переносить в другую среду разработки. Но так как это описал Miron работать (то есть компилироваться) не будет.

Как это делается, хорошо расписано в C51.pdf (в папке Keil\C51\HLP), Chapter 6. Advanced Programming Techiques -> Interfacing C Programs To Assembler.

Если в кратце, то надо сделать так:

1. Создаем ассемблерный файл приблизительно следующего содержания:

NAME ИМЯ_МОДУЛЯ

PUBLIC _Моя_Функция_С_Параметрами
;=================================================
; Прототип: uchar Моя_Функция_С_Параметрами( uchar ch );
;
; Обратите внимание на знак подчеркивания перед именем функции -
; - если функция с параметрами, то в asm он ставится
;=================================================

?PR?_Моя_Функция_С_Параметрами?ИМЯ_МОДУЛЯ SEGMENT CODE

RSEG ?PR?_Моя_Функция_С_Параметрами?ИМЯ_МОДУЛЯ

_Моя_Функция_С_Параметрами:

mov TL0,R7 ; TL0 = ch

... и так далее ...

mov R7,#возвращаемое_значение
ret


PUBLIC Моя_Функция_Без_Параметров
;=================================================
; Прототип: void Моя_Функция_Без_Параметров( void );
;
; Эта функция без параметров, поэтому знак подчеркивания перед
; не ставим
;=================================================

?PR?Моя_Функция_Без_Параметров?ИМЯ_МОДУЛЯ SEGMENT CODE

RSEG ?PR?Моя_Функция_Без_Параметров?ИМЯ_МОДУЛЯ

Моя_Функция_Без_Параметров:
push ACC

... и так далее ...

pop ACC
ret

END ;=========================================

2.
///////////////////////////////////////////////////////////////////////////////////////////
// В С-шном файле(или делаем заголовочный файл если функций несколько)
///////////////////////////////////////////////////////////////////////////////////////////

unsigned char Моя_Функция_С_Параметрами( unsigned char ch );
void Моя_Функция_Без_Параметров( void );

main()
unsigned char res;

res = Моя_Функция_С_Параметрами( 0xA0 );
Моя_Функция_Без_Параметров( );


Разумеется, нужно подключить ассемблерный файл к проекту.

Передача параметров разная в зависимости от модели памяти, типа параметров, их количества и так далее - смотрите в указанном источнике.

Сообщение отредактировал Krom - Jul 5 2005, 11:11
Go to the top of the page
 
+Quote Post

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

 


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


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