Korzystanie z usług systemowych (przerwania 80h) w systemach klasy BSD
różni się nieco od sposobu używanego w zwyczajnych
Linuksach. Mianowicie:
CALL
do instrukcji int 80h
, za którą jest RET
Żeby wszystko było jasne, podam teraz przykład:
Linux:
; wypisywanie tekstu na ekranie: mov eax, 4 mov ebx, 1 mov ecx, tekst mov edx, tekst_dlugosc int 80h
BSD:
; wypisywanie tekstu na ekranie: mov eax, 4 push dword tekst_dlugosc push dword tekst push dword 1 call jadro add esp, 12 ... ... jadro: int 80h ret
Oczywiście, ta sama procedura jadro
może służyć więcej
niż jednemu wywołaniu przerwania systemowego.
Jeśli przy próbie uruchomienia programu dostajecie komunikat Operation not permitted
(Operacja niedozwolona
), to dodajcie do kodu programu nową sekcję:
section .note.openbsd.ident align=4 dd 8 dd 4 dd 1 db 'OpenBSD', 0 dd 0
Teraz program można kompilować i linkować normalnie, to znaczy linkerem LD (tak jest pokazane dalej w kursie). Podziękowania dla 'Fr3m3n' za zgłoszenie tego sposobu.
Innym wyjściem jest skorzystanie z kompilatora GCC, zamiast linkera LD:
gcc -o program program.o
.
Funkcja główna programu (miejsce rozpoczęcia wykonywania się programu) musi
się wtedy nazywać main, a nie _start! Wadą tego podejścia jest to,
że do programu zostają dołączone pewne specjalne pliki, co powiększa jego rozmiar.