179
JĘZYK C l ASEMBLER
Na architekturze i386 <k> zwracania wyników pracy programu używa się rejestru EAX, bądź jego "mniejszych" odpowiedników, tj. AX i AH/AL. Zatem aby funkcja, napisana w asemblerze zwróciła ‘‘l” przed rozkazem ret należy napisać:
novl $1, '/.eax
Kompilatory języka C/C+ + dodają podkreślnik na początku każdej nazwy. Dla przy
kładu funkcja:
void funkcjaO;
W pliku wyjściowym l>ędzie posiadać nazwę .funkcja. Dlatego, aby korzystać z poziomu języka C z funkcji zakodowanych w asemblerze, muszą one mieć przy definicji w pliku asemblera wspomniany dodatkowy podkreślnik na początku.
Łączymy wszystko w całość
Pora, abyśmy napisali jakąś funkcję, która pobierze argumenty i zwróci jakiś konkretny wynik. Oto kod fl.S:
.t«xt
.globl .funkcja .funkcja: pushl %ebp oovl y,esp, ‘/.ebp
oovl 8C/,esp), Xeax /* kopiujeay pierwszy argument do */,eax •/
addl 12(‘/.osp), y.eax /• do pierwszogo argumentu u '/,oax dodajemy drugi argument • / popi ‘/.ebp
ret /• ... i zwracamy wynik dodawania... •/
oraz f2.c:
iinclude <stdio.h>
extern int funkcja (int a, int b);
int main ()
{
printf <M2*3-Xd\n", funkcja(2,3)>; return 0;
)
Po skompilowaniu i uruchomieniu programu powinniśmy otrzymać wydruk: 2+3=5
Oprócz możliwości wstępnie skompilowanych modułów możesz posłużyć się także tzw. wstawkami asemblerowymi. Ich użycie powoduje wstawienie w miejsce wystąpienia wstawki odpowiedniego kodu maszynowego, który powstanie po przetłumaczeniu kodu asemblerowego. Ponieważ jednak wstawki asemblerowe nie są standardowym elementem języki C. każdy kompilator ma całkowicie odmienną filozofię ich stosowania (lub nie ma ich w ogóle). Ponieważ w tym podręczniku używamy głównie kompilatora GNU, więc w tym rozdziale zostanie omówiona filozofia stosowania wstawek asemblera według programistów GNU.
Ze wstawek asemblerowych korzysta się tak: