abc Asembler - elektronski priručnik
VI dio Sistemski pozivi

VI dio Sistemski pozivi

Sistemski pozivi su API funkcije za interfejs između korisničkog prostora i prostora kernela. Već smo koristili sistemske pozive, sys_write i sys_exit, za pisanje na ekran i izlaz iz programa, respektivno.

Linux sistemski pozivi

Možemo koristiti Linux sistemske pozive u našim asemblerskim programima. Potrebno je preduzeti sljedeće korake za upotrebu Linux sistemskih poziva u programu:

  • Postaviti broj sistemskog poziva u EAX registar.
  • Spremiti argumente za sistemski poziv u registre EBX, ECX, itd.
  • Pozvati relevantni prekid (interrupt) (80h).
  • Rezultat se obično vraća u EAX registar.

Postoji 6 registara koji spremaju argumente korištenih sistemskih poziva. To su EBX, ECX, EDX, ESI, EDI i EBP. Ovi registri uzimaju konsekutivne argumente, počev od EBX registra. Ako postoji više od 6 argumenata, tada se memorijska lokacija prvog argumenta sprema u EBX registar.

Sljedeći kod pokazuje upotrebu sistemskog poziva sys_exit:

mov   eax,1 	; system call number (sys_exit)
int   0x80  	; call kernel

Sljedeći kod pokazuje upotrebu sistemskog poziva sys_write:

mov   edx,4 	; message length
mov   ecx,msg 	; message to write
mov   ebx,1 	; file descriptor (stdout)
mov   eax,4 	; system call number (sys_write)
int   0x80  	; call kernel

%eax

Ime

%ebx

%ecx

%edx

%esx

%edi

1

sys_exit

int

-

-

-

-

2

sys_fork

struct pt_regs

-

-

-

-

3

sys_read

unsigned int

char *

size_t

-

-

4

sys_write

unsigned int

const char *

size_t

-

-

5

sys_open

const char *

int

int

-

-

6

sys_close

unsigned int

-

-

-

-

Primjer:
Sljedeći primjer koda čita broj sa tastature i prikazuje ga na ekranu:

section    .data      ;Data segment
      userMsg  db  'Unesite broj: '		;Ask the user to enter a number
      lenUserMsg  equ $-userMsg 		;The length of the message
      dispMsg  db  'Uneseni broj je: '
      lenDispMsg  equ $-dispMsg

section  .bss 			;Uninitialized data
      num resb 5
section .text 			;Code Segment
           global _start
_start:
;User prompt
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int  80h

;Read and store the user input
mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 5 		;5 bytes (numeric, 1 for sign) of that information
int 80h
;Output the message 'Uneseni broj je: '
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h

;Output the number entered
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 5
int 80h

; Exit code
mov eax, 1
mov ebx, 0
int 80h

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:
Unesite broj:
1234
Uneseni broj je:1234

Segmentni registri    <    Index    >    Načini adresiranja