Pular para o conteúdo

Syscalls

Em RISC-V, syscalls permitem que um programa solicite serviços ao ambiente de execução.

Isso é feito utilizando a instrução ecall.

No simulador ÆRIS, syscalls são utilizados principalmente para entrada e saída no console.

Diferente de um sistema operacional real, o ÆRIS não possui modo kernel, então o ecall é tratado diretamente pelo simulador.


Uma syscall segue três passos:

  1. Definir o código da syscall no registrador a7
  2. Passar os argumentos nos registradores (a0, a1, …)
  3. Executar a instrução ecall

Exemplo:

li a7, 1
li a0, 42
ecall

Isso imprime o número 42.


CódigoNomeDescrição
1PrintIntImprime o inteiro em a0
4PrintStringImprime string a partir do endereço em a0
5ReadIntLê um inteiro do console
8ReadStringLê uma string do console
10ExitPara a execução e imprime -- program is finished --

Imprime o valor inteiro armazenado em a0.

Exemplo:

li a7, 1
li a0, 123
ecall

Saída:

123

Imprime uma sequência de caracteres a partir do endereço em a0.

No ÆRIS, strings não possuem terminador nulo automático.

Exemplo:

.data
msg: .ascii "Hello"
.text
main:
li a7, 4
la a0, msg
ecall

Lê um número inteiro do usuário.

Exemplo:

li a7, 5
ecall

Comportamento:

  1. O simulador pausa a execução
  2. O usuário insere um número
  3. O valor é armazenado em a0

Lê uma sequência de caracteres do usuário e armazena na memória.

Argumentos:

RegistradorDescrição
a0Endereço do buffer
a1Tamanho máximo

Exemplo:

.data
buffer: .word 0,0,0,0,0,0,0,0
.text
main:
li a7, 8
la a0, buffer
li a1, 32
ecall

Comportamento:

  • O usuário digita uma string
  • Os caracteres são escritos na memória a partir de a0
  • No máximo a1 bytes são armazenados

Para a execução do programa e imprime -- program is finished -- no console.

Exemplo:

li a7, 10
ecall

Comportamento:

  • O simulador interrompe a execução imediatamente
  • A mensagem -- program is finished -- é exibida no console