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.