Цитата(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