178
ROZDZIAŁ 25. ŁĄCZENIE Z INNYMI JĘZYKAMI
pushl ‘/.ebp aovl Xesp, ‘/.ebp
movl $4, Xeax /* 4 to funkcja systemowa "write" •/
movl $1, 7,ebx /* 1 to stdout */
movl Stekst, */,ecx /* adres naszego napisu •/
movl $len, %edx /* długość napisu w bajtach */
int $0x80 /* wywołanie przerwania systemowego •/
popi Xebp
ret
.data
tekst:
.string "Hello world\n” len • . - tekst
W systemach z rodziny UNIX należy pominąć znak przed nazwą funkcji fl
Teraz kolej na f2.c:
extern void fl (void); /* musimy użyć słowa extern */ int main ()
return 0;
Teraz możemy skompilować ol»a programy:
as fl.S -o fl.o
gcc f2.c -c -o f2.o
gcc f2.o fl.o -o program
W ten sposób uzyskujemy plik wykonywalny o nazwie “program”. Efekt działania prognunu powinien być następujący:
Hello world
Na razie utworzyliśmy bardzo prostą funkcję, która w zasadzie nie komunikuje się z językiem C. czyli nie zwraca żadnej wartości ani nie pobiera argumentów. Jednak, aby zacząć pisać olusługę funkcji, która będzie pobierała argumenty i zwracała wyniki musimy |M>znać działanie języka C od trochę niższego poziomu.
Do komunikacji z funkcją język C korzysta ze stosu. Argumenty odkładane są w kolejności od ostatniego do pierwszego. Ponadto na końcu odkładany jest tzw. adres powrotu, dzięki czemu po wykonaniu funkcji program “wic", w którym miejscu ma kontynuować działanie. Ponadto, początek funkcji w asemblerze wygląda tak:
pushl ŹCebp aovl y.esp, y.ebp
Zatem na stosie znajdują się kolejno: zawartość rejestru EBP, adres powrotu a następnie argumenty od pierwszego do n-tego.