Ero sivun ”Syscall()” versioiden välillä
Siirry navigaatioon
Siirry hakuun
(Ensimmäinen artikkelini - virheet todennäköisiä) Merkkaukset: Mobiilimuokkaus mobiilisivusto-muokkaus |
p (lisätty luokka, ettei artikkeli jää täysin erilleen wikissä) |
||
Rivi 43: | Rivi 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Luokka:C-standardikirjasto]] |
Versio 12. toukokuuta 2022 kello 18.16
Syscall on C-standardikirjaston tarjoama funktio, jolla pystyy kutsumaan järjestelmäkutsun. Funktio löytyy unistd.h-otsaketiedostosta. Syscall-funktio on määritelty seuraavasti:
long syscall(long number, ...);
Määritelmän mukaan syscall-funktio vaatii vähintään yhden argumentin eli kutsuttavan järjestelmäkutsun numeron sekä järjestelmäkutsusta riippuen mahdollisesti tietyn määrän tietyn tyyppisiä argumentteja. Järjestelmäkutsun kutsumisen lisäksi funktio asettaa tarvittaessa errno-muuttujan tietyn arvon.
Funktion luominen
Mikäli haluat tehdä oman C-kirjaston, voit luoda oman syscall-funktion. Mikäli oletetaan, että saatavilla on vain kolme järjestelmäkutsua: open (0) , read (1) ja write (2), voidaan funktio yksinkertaisimmillaan ohjelmoida NASM-kielellä näin:
[BITS 64]
global syscall
extern ENOSYS
extern ERRNO
section .text
syscall:
cmp rax, NSYSCALLS
ja nosyscall
syscall
cmp rax, 0
push rax
push rcx
jb set_errno
pop rcx
pop rax
ret
nosyscall:
mov rax, ENOSYS
set_errno:
mov rcx, rax
sub rax, rcx
sub rax, rcx
mov errno, rax
section .data
NSYSCALLS: resb 2