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:
1 # imprimir inteiro (a0 = número)4 # imprimir string (a0 = endereço do texto)5 # ler inteiro (resultado retornado em a0)10 # encerrar o programa32 # pausar (a0 = milissegundos)
a7 = 1 seleciona o serviço de impressão.
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.li a7, 5 # ler inteiro -> a0ecalladd a0, a0, a0 # dobra o valorli a7, 1 # imprimir inteiroecallli a7, 10ecall
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.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = endereço do textoli a7, 4 # imprimir stringecallli a7, 10ecall
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.
