Entrada e saída

Entrada e saída

lida com toda a entrada e saída. Um (chamada de ambiente) pede ao sistema operacional ou ao simulador para executar um serviço para o seu código assembly. A tela e o teclado são dois dos serviços disponíveis dessa forma.

Insira o número do serviço no registrador a7, qualquer argumento no a0, e então dispare o . Os serviços suportados por este simulador são:

Serviços (a7)
1 # imprimir inteiro (a0 = número)
4 # imprimir string (a0 = endereço do texto)
5 # ler inteiro (resultado retornado em a0)
10 # encerrar o programa
32 # pausar (a0 = milissegundos)
Chamada de serviço
programa
a71
a0valor
ecall
sistemaimprime um número

a7 = 1 seleciona o serviço de impressão.

Todos os serviços compartilham o mesmo protocolo de comunicação de dois registros. a7 indica qual serviço deve ser executado, e a0 transporta tudo o que esse serviço precisa: um valor a ser exibido, um endereço do qual ler, um tempo de espera. A lista é fixa e curta, com cinco itens; portanto, aprender esse protocolo de comunicação uma vez abrange todas as formas como esse simulador se comunica com o mundo externo. Um sistema operacional real estende essa mesma ideia para uma lista muito mais longa.
Leia um número, duplique-o e imprima-o
li a7, 5 # ler inteiro -> a0
ecall
add a0, a0, a0 # dobra o valor
li a7, 1 # imprimir inteiro
ecall
li a7, 10
ecall

seleciona a leitura de inteiro e pausa para entrada, retornando seu número em a0. soma a0 a ele mesmo, dobrando-o no local. Em seguida, e imprimem o resultado, e e encerram. Quando você o executa, o simulador exibe uma caixa de entrada. Digite um número e veja-o voltar dobrado.

Imprimindo texto

Primeiro, duas novas palavras. Uma seção é uma região identificada do seu programa: as instruções ficam na seção .text, enquanto dados fixos, como texto, ficam na seção .data. E um endereço é simplesmente um número que identifica um espaço na memória. Em vez de carregar uma string inteira, um registro pode conter o endereço onde a string começa, e o serviço de impressão lê a partir daí.

O texto fica na seção data. Você anexa um rótulo a ele e depois usa ("load address") para carregar o endereço desse rótulo e o serviço 4 para imprimi-lo.

Olá, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = endereço do texto
li a7, 4 # imprimir string
ecall
li a7, 10
ecall

Em .data, a diretiva reserva espaço para o texto e anexa o rótulo msg. .string armazena os caracteres e acrescenta \n, uma nova linha. Em .text, coloca o endereço do texto em a0, escolhe o serviço de impressão de string, e imprime os caracteres a partir desse endereço até chegar ao fim da string. Em seguida, o programa encerra como de costume.