23 pontos por GN⁺ 2025-10-28 | 2 comentários | Compartilhar no WhatsApp
  • 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

 
lsdcnu 2025-11-06

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!!!

 
GN⁺ 2025-10-28
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

    • Por que não fazer isso diretamente com o cérebro?
  • 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

    • Provavelmente o RISC-V está mais próximo do RISC-1. Há um texto do próprio Patterson explicando isso: How close is RISC-V to RISC-I, RISC on a Chip
    • Eu também senti a semelhança entre RISC-V e MIPS. Fazendo homebrew para Nintendo 64, eu pensava com frequência: “isso aqui é praticamente igual ao que eu mexia antes no Ares+Godbolt, só que sem delay slot”
    • As pessoas não percebem bem quantos pontos pouco claros existem sobre de onde veio o design do AArch64 e com qual filosofia ele foi criado
    • É fácil adicionar instruções, mas difícil removê-las. O RISC-V começou com um conjunto mínimo de instruções e vem sendo expandido gradualmente desde então. Para propor uma nova instrução, é preciso provar seu custo e benefício prático
    • Se bem me lembro, Computer Architecture: A Quantitative Approach também falava sobre a semelhança entre RISC-V e MIPS. O livro está numa caixa agora, então não sei a página exata
  • 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 lui em vez de auipc para sair 0x3004?

    • Não. lui gera um endereço absoluto, mas a combinação auipc/addi cria um endereço independente de posição. Se o auipc estivesse no endereço zero, o resultado seria o mesmo, mas na prática o valor é somado ao endereço da instrução atual
  • A 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

    • O assembly RISC-V em geral é fácil, mas há abreviações de instrução demais, o que incomoda. Poderiam usar nomes mais intuitivos como load4 em vez de lw e jump em vez de j; não estamos mais na era dos cartões perfurados, então não sei por que tudo ainda é tão curto
  • Este 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

    • Não é exatamente sobre mexer direto no hardware com Rust, mas há um bom tutorial cobrindo fundamentos de SO: Operating System in 1000 Lines
      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

    • O VisionFive 2 Lite também deve ser lançado em breve, e estou ansioso por isso. Falta um pouco em drivers e desempenho, mas para desenvolvimento de SO parece servir bem
      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
    • Talvez seja mais fácil começar com ESP-32. É muito mais fácil de encontrar
  • 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