Informacja dla użytkowników systemów *BSD

Korzystanie z usług systemowych (przerwania 80h) w systemach klasy BSD różni się nieco od sposobu używanego w zwyczajnych Linuksach. Mianowicie:

  1. numer funkcji przekazujemy w EAX
  2. parametry wkładamy na stos od prawej do lewej (od końca)
  3. przerwanie wywołujemy, wykonując 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.



Kolejna część kursu (Alt+4)
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)