Montagem - Chamadas de Sistema

As chamadas do sistema são APIs para a interface entre o espaço do usuário e o espaço do kernel. Já usamos as chamadas de sistema. sys_write e sys_exit, para escrever na tela e sair do programa, respectivamente.

Chamadas de sistema Linux

Você pode fazer uso de chamadas de sistema Linux em seus programas de montagem. Você precisa seguir os seguintes passos para usar chamadas de sistema Linux em seu programa -

  • Coloque o número de chamada do sistema no registro EAX.
  • Armazene os argumentos para a chamada do sistema nos registros EBX, ECX, etc.
  • Ligue para a interrupção relevante (80h).
  • O resultado geralmente é retornado no registro EAX.

Existem seis registradores que armazenam os argumentos da chamada de sistema usada. São EBX, ECX, EDX, ESI, EDI e EBP. Esses registradores recebem os argumentos consecutivos, começando com o registrador EBX. Se houver mais de seis argumentos, a localização da memória do primeiro argumento é armazenada no registrador EBX.

O seguinte snippet de código mostra o uso da chamada do sistema sys_exit -

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

O seguinte snippet de código mostra o uso da chamada de sistema 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

Todas as syscalls estão listadas em /usr/include/asm/unistd.h , junto com seus números (o valor a ser colocado em EAX antes de chamar int 80h).

A tabela a seguir mostra algumas das chamadas de sistema usadas neste tutorial -

% eax Nome % ebx % ecx % edx % esx % edi
1 sys_exit int - - - -
2 sys_fork struct pt_regs - - - -
3 sys_read int sem sinal Caracteres * size_t - -
4 sys_write int sem sinal const char * size_t - -
5 sys_open const char * int int - -
6 sys_close int sem sinal - - - -

Exemplo

O exemplo a seguir lê um número do teclado e o exibe na tela -

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

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Please enter a number:
1234  
You have entered:1234