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