ecall

ecall

Assembly RISC-V Referência

lyszt.net aborda ecall e outras instruções RISC-V com mais detalhes.

Descrição

ecall pede ao ambiente em que seu programa é executado que realize um serviço. O assembly pode somar e mover números, mas a tela, o teclado e outros dispositivos pertencem ao sistema que hospeda o programa, então o código não consegue alcançá-los por conta própria. ecall significa chamada ao ambiente. Ele interrompe seu código, o hospedeiro executa o serviço, e o controle volta para o seu código. O hospedeiro é um sistema operacional em hardware real, e neste simulador é o próprio simulador.

O programa nomeia o serviço que deseja. Por convenção, o número do serviço vai em a7, quaisquer dados de que o serviço precise vão em a0, e então ecall é executado. Este simulador oferece estes serviços: 1 imprime o inteiro em a0, 4 imprime o texto no endereço em a0, 5 lê um número da entrada para a0, 10 encerra o programa, e 32 pausa por a0 milissegundos.

Para imprimir um número, carregue 1 em a7 para selecionar o serviço de impressão, carregue o número em a0, e execute ecall. O exemplo faz isso. O serviço 10 encerra um programa, e é por isso que as lições terminam com as duas linhas abaixo. Sem ele, o processador continua além da última linha para o que vier em seguida.

li a7, 10
ecall

O manual do RISC-V afirma que ecall faz uma solicitação de serviço ao ambiente de execução, e que o ambiente decide como os parâmetros são passados, geralmente em registradores inteiros definidos. Este simulador é o ambiente aqui e ele define os números de serviço listados acima. O manual também observa que ecall antes se chamava scall. Seu companheiro ebreak devolve o controle a um depurador. Ambos geram uma armadilha precisa e solicitada ao ambiente.

Um sistema operacional completo funciona da mesma forma, com uma lista mais longa de serviços.

Exemplo

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42