Integracja asemblera z C w projektach na '51 z użyciem Keila i #pragma SRC
Re: c + asm '51
From: "Jerzy Szczesiul" <Jerzy.Szczesiul_at_nospam_ep.com.pl>
Subject: Re: c + asm '51
Date: Sun, 2 May 1999 14:28:44 +0300
Czesc
Witam !
Jak ruszyc z polaczeniem asemblera z C na '51. Mam kompilatory
Archimedesa
Uzywam Keila, wiec nie powiem Ci jak to zrobic w Archimedesie ani
Franklinie, ale sprawdz, czy te kompilatory 'C' nie maja funkcji
generacji kodu zrodlowego dla ASM.
W Keilu jest to #pragma SRC.
Nalezy napisac sobie krotka funkcje (o nazwie takiej, jak docelowa) w
modelu, w jakim masz program i z taka sama iloscia i typem parametrow
we/wy, a otrzymany w ten sposob shell uzupelnic swoim kodem funkcji w
ASM i skompilowac.
Zeczywiscie jest #pragma SRC, tylko nie wiem czy dobrze zrozumialem; moj
problem polega na tym, ze mam kupe wlasnych funkcji w asemblerze i
chcialbym je wykorzystac w C.
wykorzystujac #pragma SRC zeczywiscie dostajemy "tlumaczenie" z C na Asm
ale jak wykorzystac juz to co mam gotowe ?
Tomek
No to bardziej szczegolowo na przykladzie FSI :
- w glownym pliku projektu podeklaruj potrzebne funkcje jako
extern
- tak jak poradzil kol. Jaroslaw :
przygotuj plik *.c na swoje funkcje, powpisuj je jako "nic nie robiace"
( ew. wpisz return(cos tam) to bedzie szablon wyprowadzenia wyniku ),
- skompiluj *.c z opcja SRC - otrzymasz assemblerowy *.src
- przemianuj go na *.a51 i dolacz do projektu
- teraz powstawiaj do poszczegolnych funkcji assemblerowych
w *.a51 swoje stare procedury - pewnie nie obedzie sie bez
przerobek. Zwroc uwage na pobranie parametrow i wyprowadzenie
wyniku - to zalezy od kompilatora ( w FSI jest dokladnie opisane w
pomocy).
Mozesz to tez zrobic bardziej "recznie" co z kolei pozwala lepiej
poznac mechanizmy dzialania kompilatora. Stare procedury nalezy
umiescic w segmentach o nazwach zrozumialych dla linkera. Np.
w FSI jest to ?obszar_pamieci?nazwa_segmentu?nazwa_modulu,
jako nazwe segmentu wstawiasz nazwe swojej procedury
(NAME lub _NAME zaleznie czy sa przekazane parametry )
Np:
; to plik assemblerowy ftest.a51
NAME FTEST ; nazwa modulu
?PR?_MYFUNC?FTEST SEGMENT CODE
?PR?_MYFUNC1?FTEST SEGMENT CODE
; PR - obszar pamieci programu;
PUBLIC _Myfunc,_Myfunc1 ; udostepnienie procedur
RSEG ?PR?_MYFUNC?FTEST
_MYFUNC:
MOV A,R7 ; pobranie argumentu
; tu miejsce na dodatkowy kod
MOV R4,A ; zwrot wyniku funkcji
RET
RSEG ?PR?_MYFUNC1?FTEST
_MYFUNC1:
MOV A,R7
MOV R4,A
RET
END
A w programie:
/* zobaczmy jak jest ze sciaganiem funkcji */
extern unsigned char Myfunc(char val);
extern unsigned char Myfunc1(char val);
...
mybyte=Myfunc(100);
mybyte=Myfunc1(50);
Te funkcje nic nie robia a tylko zwracaja argument / FSI lokuje
1. argument char w R7 natomiast zwrot char - do R4 ; w c byloby to:
unsigned char Myfunc(char value)
{
return(value);
}
Pozdrowienia i powodzenia
Jurek Szczesiul
Jerzy.Szczesiul_at_nospam_ep.com.pl
From: "jachu" <tomekj_at_nospam_zt.jeleniag.tpsa.pl>
Subject: Re: c + asm '51
Date: Mon, 03 May 1999 14:50:16 GMT
Jerzy Szczesiul <Jerzy.Szczesiul_at_nospam_ep.com.pl> wrote in article
<tyXW2.27090$811.514477_at_nospam_news.tpnet.pl>...
No to bardziej szczegolowo na przykladzie FSI :
- w glownym pliku projektu podeklaruj potrzebne funkcje jako
extern
- tak jak poradzil kol. Jaroslaw :
przygotuj plik *.c na swoje funkcje, powpisuj je jako "nic nie robiace"
( ew. wpisz return(cos tam) to bedzie szablon wyprowadzenia wyniku ),
- skompiluj *.c z opcja SRC - otrzymasz assemblerowy *.src
- przemianuj go na *.a51 i dolacz do projektu
- teraz powstawiaj do poszczegolnych funkcji assemblerowych
w *.a51 swoje stare procedury - pewnie nie obedzie sie bez
przerobek. Zwroc uwage na pobranie parametrow i wyprowadzenie
wyniku - to zalezy od kompilatora ( w FSI jest dokladnie opisane w
pomocy).
Mozesz to tez zrobic bardziej "recznie" co z kolei pozwala lepiej
poznac mechanizmy dzialania kompilatora. Stare procedury nalezy
umiescic w segmentach o nazwach zrozumialych dla linkera. Np.
w FSI jest to ?obszar_pamieci?nazwa_segmentu?nazwa_modulu,
jako nazwe segmentu wstawiasz nazwe swojej procedury
(NAME lub _NAME zaleznie czy sa przekazane parametry )
Np:
; to plik assemblerowy ftest.a51
NAME FTEST ; nazwa modulu
?PR?_MYFUNC?FTEST SEGMENT CODE
?PR?_MYFUNC1?FTEST SEGMENT CODE
; PR - obszar pamieci programu;
PUBLIC _Myfunc,_Myfunc1 ; udostepnienie procedur
RSEG ?PR?_MYFUNC?FTEST
_MYFUNC:
MOV A,R7 ; pobranie argumentu
; tu miejsce na dodatkowy kod
MOV R4,A ; zwrot wyniku funkcji
RET
RSEG ?PR?_MYFUNC1?FTEST
_MYFUNC1:
MOV A,R7
MOV R4,A
RET
END
A w programie:
/* zobaczmy jak jest ze sciaganiem funkcji */
extern unsigned char Myfunc(char val);
extern unsigned char Myfunc1(char val);
...
mybyte=Myfunc(100);
mybyte=Myfunc1(50);
Te funkcje nic nie robia a tylko zwracaja argument / FSI lokuje
1. argument char w R7 natomiast zwrot char - do R4 ; w c byloby to:
unsigned char Myfunc(char value)
{
return(value);
}
Pozdrowienia i powodzenia
Jurek Szczesiul
Jerzy.Szczesiul_at_nospam_ep.com.pl
Wielkie dzieki!!!
juz wiem o co chodzi.
Tomek