Kernel calls werken als volgt:
- wat er bij %eax staat steek je in eax
- het eerste argument steek je in ebx, het tweede in ecx, het derde in edx, enz...
- om de kernel call effectief uit te voeren roep je interrupt 0x80 aan via int 80h of int 0x80
----
Een voorbeeldje in NASM / Intel syntax:
; Enkele defines voor de assembler
STDIN: equ 0
STDOUT: equ 1
SYS_READ: equ 3
SYS_WRITE: equ 4
SYS_EXIT: equ 1
SUCCESS: equ 0
MAX_SIZE: equ 100
section .data
message: db 'Wat wil je zeggen?', 10, 0 ; Bericht dat de gebruiker ziet + newline + nullbyte
message_len: equ $-message ; Lengte van message in bytes
outputmsg: db 'Je zei: ', 0
outputmsg_len: equ $-outputmsg
section .bss
input: resb MAX_SIZE ; Reserveer een string van MAX_SIZE bytes
section .text
global _start
_start:
; Bericht weergeven
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, message
mov edx, message_len
int 80h
; Lijn inlezen
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, input
mov edx, MAX_SIZE
int 80h
; Ingelezen lijn weergeven
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, outputmsg
mov edx, outputmsg_len
int 80h
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, input
mov edx, MAX_SIZE
int 80h
; Exit
mov eax, SYS_EXIT
mov ebx, SUCCESS
int 80h
assembleren met: nasm -felf read.asm && ld -s -o read read.o
nadien uitvoeren met: ./read