Professional Documents
Culture Documents
11 - C És Assembly
11 - C És Assembly
pl.:
asm mov dx,3dah
asm out dx,ax
vagy:
asm {
mov dx,3dah
out dx,al
Ez a megoldás nem 'túl elegáns ,azonkívül van egy pár hátránya is. Először is a C fordítók
körében korántsem mondható áltálánosnak ez a megoldás. A Borland C éppen tudja, de azt
hiszem ezzel ki is merült a kör. Az utasításkészlettel is szoktak bajok lenni, hiszen ezzel a
módszerrel csak 8086-os utasításkészletet lehet használni. Ez persze nem mindig elég. Aztán
a cimkékkel is van baj. Nem lehet az assembly-n belül cimkét deklarálni. tehát:
asm {
cimke:
loop cimke
Persze azért van előnnye is. Egy fileban van a C-vel, így nem kell belelinkelgetni a
programba,és könnyen lehet debugolni.
Az igazi megoldás külön file-ba rakni az assemblyt. Ez persze jóval bonyolultabb, de megéri.
Egy C alá írt assemblynek valami hasonlóképpen kell kinézni.:
.286 ;utasításkészlet
EXTRN.n1:tipus ;extern lista
EXTRN n2:tipus
.DATA
adatok...
.CODE
lenyeg..
END
Az első két soron nincs mit rizsázni. Az extern lista: Azokat a változókat, függvényeket itt
kell felsorolni, amiket az assembly használni akar a C-ből. A tipust is meg kell adni, ez lehet
byte,word,dword ha változó. Ha c-ben char, akkor byte, ha int akkor word, ha long, akkor
dword. Lehet egy C-függvényt is lehet externelni, ilyenkor proc. Public lista : Azokat a
függvényeket, változókat itt kell megadni, amit a C lásson az assembly-ből. Tipus nem kell,
csak vesszővel felsoroljuk.
Aztán az assembly rutin részéről még vannak kötelezettségek. Menteni kell az általunk
változtatott regisztereket, (push a rutin elején) (különös tekintettel az si,di, és a
szegmensregiszterekre), de visszaszedni ne felejtsük el(pop), mert ilyenkor csak a reset gomb
fog segíteni. Hasonló a helyzet akor is, ha a ret-et felejtük el.
De a C-ben is rendezni kell a dolgokat. Ezt legegyszer?bb egy header file-ban megtenni, amit
majd include-olunk abban a C-ben ahol az assemblyt használni akarjuk. Az include file:
#ifdef __cplusplus
extern "C"
#endif
void fuggvegy(void)
#ifdef __cplusplus
#endif
Magyarázat:
A C és a C++ kicsit máshogy kezeli a függvényeket, ezért , ha C++-ban vagyunk, meg kell
adni, hogy a függvények C típusúak. Erre szolgál az extern "C"{..........}.
Szeretnél friss híreket a weboldaladra? Katt ide a részletekért!
A dolog már rendezve van mind a C, mind az assembly részéről, már csak le kéne fordítani a
programot. Ez Borland C-ben a legegyszerűbb, csinálunk egy olyan projektet, amiben benne
van az assembly, és a C is. A Borland magától össze fogja linkelni őket. Más
fordítórendszereknél külön compile-oljuk a c-t, az assemblyt, majd összelinkeljük azokkal a
libekkel amit használ. Persze make filet is írhatunk de ez már nem ide tartozik.