Montaj - Sistem Çağrıları

Sistem çağrıları, kullanıcı alanı ile çekirdek alanı arasındaki arayüz için API'lerdir. Sistem çağrılarını zaten kullandık. sırasıyla ekrana yazmak ve programdan çıkmak için sys_write ve sys_exit.

Linux Sistem Çağrıları

Assembly programlarınızda Linux sistem çağrılarından yararlanabilirsiniz. Programınızda Linux sistem çağrılarını kullanmak için aşağıdaki adımları atmanız gerekir -

  • Sistem çağrı numarasını EAX kaydına girin.
  • Sistem çağrısındaki argümanları EBX, ECX vb. Kayıtlarında saklayın.
  • İlgili kesmeyi arayın (80h).
  • Sonuç genellikle EAX kaydına döndürülür.

Kullanılan sistem çağrısının argümanlarını depolayan altı kayıt vardır. Bunlar EBX, ECX, EDX, ESI, EDI ve EBP'dir. Bu kayıtlar, EBX yazmacından başlayarak ardışık argümanları alır. Altıdan fazla argüman varsa, ilk argümanın hafıza konumu EBX kaydında saklanır.

Aşağıdaki kod parçacığı, sys_exit sistem çağrısının kullanımını gösterir -

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

Aşağıdaki kod parçası, sys_write sistem çağrısının kullanımını gösterir -

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

Tüm sistem çağrıları /usr/include/asm/unistd.h dosyasında numaralarıyla birlikte listelenir (int 80h'yi aramadan önce EAX'e koymanız gereken değer).

Aşağıdaki tablo, bu eğitimde kullanılan bazı sistem çağrılarını göstermektedir -

% eax İsim % ebx % ecx % edx % esx % edi
1 sys_exit int - - - -
2 sys_fork struct pt_regs - - - -
3 sys_read imzasız int karakter * size_t - -
4 sys_write imzasız int const karakter * size_t - -
5 sys_open const karakter * int int - -
6 sys_close imzasız int - - - -

Misal

Aşağıdaki örnek klavyeden bir sayı okur ve ekranda görüntüler -

section .data                           ;Data segment
   userMsg db 'Please enter a number: ' ;Ask the user to enter a number
   lenUserMsg equ $-userMsg             ;The length of the message
   dispMsg db 'You have entered: '
   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 'The entered number is: '
   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

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Please enter a number:
1234  
You have entered:1234