Integracja asemblera z C w projektach na '51 z użyciem Keila i #pragma SRC

Re: c + asm '51





Poprzedni Następny
Wiadomość
spis treści
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 :
extern
przygotuj plik *.c na swoje funkcje, powpisuj je jako "nic nie robiace"
( ew. wpisz return(cos tam) to bedzie szablon wyprowadzenia wyniku ),
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




Poprzedni Następny
Wiadomość
spis treści
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