- Um tutorial interativo para aprender assembly RISC-V passo a passo por meio de um emulador executável no navegador, criado com inspiração no Easy 6502 de Nick Morgan
- Cobre as 45 instruções básicas do conjunto RV32I_Zicsr e os conceitos centrais da arquitetura privilegiada, ensinando um conjunto de instruções suficientemente completo para servir de alvo de compilador
- Oferece os fundamentos da programação em assembly com exemplos práticos, incluindo operações aritméticas/lógicas, desvios/saltos, acesso à memória, convenções de chamada de função e gerenciamento de pilha
- Explica com código real a troca de nível de privilégio entre os modos Machine e User, tratamento de exceções e manipulação de CSR (registradores de controle e estado)
- O objetivo final do tutorial é escrever manualmente um sistema operacional minúsculo com suporte a chamadas de sistema e tratamento de exceções, permitindo vivenciar todo o fluxo do desenvolvimento de baixo nível em RISC-V
Estrutura do tutorial e principais conteúdos de aprendizado
Instruções básicas e conceitos de processador
- Estado do processador: compreensão do contador de programa (pc), 31 registradores de uso geral (x1~x31) e do registrador zero especial (x0)
- Instruções aritméticas: aprendizado de soma/subtração e comportamento de overflow com
add, addi, sub etc.
- Operações de bits: prática com operações lógicas bit a bit e instruções de shift como
and, or, xor, sll, srl, sra
- Instruções de comparação: implementação de lógica condicional e comparação de inteiros com e sem sinal usando
slt, sltu etc.
Fluxo de controle e memória
- Desvios e saltos: mecanismos de desvio condicional/incondicional e chamadas de função com
beq, bne, blt, jal, jalr etc.
- Acesso à memória: operações de load/store em palavra, meia palavra e byte com as instruções
lw, sw, lb, lh, sb, sh
- I/O mapeado em memória: compreensão da comunicação com dispositivos externos por leitura/escrita em endereços específicos
- Código independente de posição: técnicas para escrever código relocável com a instrução
auipc e endereçamento relativo ao PC
Funções e convenções de chamada
- Apelidos de registradores: papéis de
a0~a7 (argumentos), s0~s11 (preservados), t0~t6 (temporários), ra (endereço de retorno), sp (ponteiro de pilha) etc.
- Gerenciamento de pilha: padrões de salvar registradores na entrada da função, alocar/liberar espaço na pilha e preservar/restaurar o endereço de retorno
- Funções recursivas: prática de chamadas recursivas e gerenciamento de stack frames por meio da implementação da sequência de Fibonacci
Arquitetura privilegiada e sistema operacional
- Níveis de privilégio: diferenças entre o modo Machine (nível 3) e o modo User (nível 0), além dos mecanismos de isolamento
- Instruções CSR: leitura/escrita de registradores de controle e manipulação de campos de bits com
csrrw, csrrs, csrrc etc.
- Tratamento de exceções: inspeção de informações de exceção e escrita de handlers com os CSRs
mcause, mepc, mtval, mstatus
- Troca de modo: entrada e retorno do modo User com a instrução
mret e troca de contexto com mscratch
Projeto final: um micro-OS
- Implementação de chamadas de sistema: uso da instrução
ecall para gerar trap do modo User para o modo Machine e fornecer as funções putchar/exit
- Salvar/restaurar registradores: estrutura completa de um trap handler que faz backup e restauração de todos os registradores de uso geral na pilha
- Lógica de tratamento de exceções: identificação da causa da exceção com
mcause, despacho por número de chamada de sistema (a7) e saída de mensagens de erro
- Código executável: fornecimento de código completo de entrada/retorno do kernel do OS, executável diretamente no emulador web
Materiais de referência e licença
- Tutorial e código disponíveis sob domínio público CC0 ou licença BSD de 0 cláusulas
- Texto original e repositório de código: https://github.com/dramforever/easyriscv
- Adequado para aprendizado de RISC-V, pesquisa, ensino e montagem de ambientes de simulação
2 comentários
Uau
Comecei a me interessar por assembly RISC-V, que aprendemos nas aulas da faculdade... Eu até pensei em comprar um livro por fora, mas só encontrava material sobre arquitetura ARM e nada de RISC-V, então estava justamente pensando no que deveria estudar. Acho que encontrei um recurso bom demais para aprender.
Obrigado!!!
Opinião no Hacker News
Foi um guia realmente muito bom
Eu gostaria que a primeira tela do emulador de “My first RISC-V assembly program” estivesse logo no começo do guia. Caso contrário, os leitores podem achar que é só uma introdução em texto, apesar do título dizer que é “interactive”
Vou dedicar mais alguns dias a isso. Tenho bastante interesse em RISC-V e acho que ele tem um futuro brilhante
Se algum especialista em IA estiver lendo isto, seria muito legal recriar Core War em assembly RISC-V com uma plataforma como Replit ou Lovable
Aprendi assembly com Computer Organization And Design, de Patterson e Hennessy, e dá para sentir claramente o quanto o RISC-V herdou do MIPS
As mesmas pessoas estiveram envolvidas em ambas as ISAs, e eles evitaram erros como o delay slot do MIPS. Se você tem experiência com MIPS, o assembly RISC-V parece quase igual
Ultimamente também estou olhando para AArch64, e embora ele seja menos elegante que o RISC-V, seu design prático é impressionante. Às vezes até penso se o RISC-V não foi projetado de forma conservadora demais
Eu mesmo escrevi TCP Socket in RISC-V Assembly
Usei a ISA RV64I, e é preciso entender o conceito de linker relaxation. Também deixei materiais de referência junto
Acho que há um erro na seção de Position Independence
No código de exemplo, não deveria usar
luiem vez deauipcpara sair 0x3004?luigera um endereço absoluto, mas a combinaçãoauipc/addicria um endereço independente de posição. Se oauipcestivesse no endereço zero, o resultado seria o mesmo, mas na prática o valor é somado ao endereço da instrução atualA estrutura interativa deste conteúdo é realmente excelente
Como desenvolvedor C/C++, eu sempre achei assembly difícil, mas com esse formato ficou muito mais claro de entender
load4em vez delwejumpem vez dej; não estamos mais na era dos cartões perfurados, então não sei por que tudo ainda é tão curtoEste artigo me deu vontade de voltar a fazer programação de baixo nível
Na faculdade de mecatrônica eu trabalhava com microcontroladores em C e assembly, mas hoje migrei para desenvolvimento web
Gostaria de saber se existe algum material confiável para aprender hardware RISC-V. Se possível, queria tentar com Rust
Também havia um tutorial de SO em Rust, mas não consigo achar o link agora
Se você quiser hardware de verdade, recomendo o neorv32 — a documentação é boa: documentação oficial, repositório no GitHub. É um núcleo RISC-V escrito em VHDL
Hardware RISC-V é fácil de encontrar
Veja RISC-V on Raspberry Pi Pico 2
Veja a página no Kickstarter
E se você quiser mexer com RISC-V e FPGA ao mesmo tempo, também existe o PolarFireSoC. É bem mais barato e utilizável do que AMD/Xilinx. O ambiente de desenvolvimento é meio antigo, mas rápido, e a documentação é espalhada, mas quase tudo está em algum lugar
Link do kit de desenvolvimento
O curioso é que a placa de desenvolvimento é mais barata que o chip
Coincidentemente, esta semana entrei na unidade de introdução a assembly em um curso de C, e pensei que aprender com RISC-V poderia evitar problemas de diferença entre CPUs
Mas alguém já foi lá e organizou perfeitamente um material exatamente assim. Muito obrigado
No exemplo “subtrair de zero gera um número negativo”, o negativo de 0x123 é 0xfffffedd
Foi dito que o emulador mostra 0xfffffccd, mas na verdade 0xfffffedd é o correto. Eu mesmo fiz a conta, e o emulador está correto
Se estiver procurando um bom emulador RISC-V, recomendo o RARS