Easy RISC-V: Tutorial Pengantar Pemrograman Assembly RISC-V Interaktif
(dramforever.github.io)- Tutorial interaktif untuk mempelajari assembly RISC-V langkah demi langkah melalui emulator yang dapat dijalankan di browser web, dibuat dengan inspirasi dari Easy 6502 karya Nick Morgan
- Mencakup 45 instruksi dasar dari set instruksi RV32I_Zicsr serta konsep inti dari arsitektur privileged, mengajarkan set instruksi yang cukup lengkap untuk menjadi target compiler
- Menyediakan dasar-dasar pemrograman assembly seperti operasi aritmetika/logika, percabangan/lompatan, akses memori, konvensi pemanggilan fungsi, dan pengelolaan stack beserta contoh praktik
- Menjelaskan dengan kode nyata cara melakukan peralihan level privileged antara mode Machine dan mode User, penanganan exception, serta manipulasi CSR (control and status register)
- Tujuan akhir tutorial ini adalah menulis sendiri sistem operasi sangat kecil yang mendukung system call dan penanganan exception, sehingga pembaca dapat mengalami alur lengkap pengembangan low-level RISC-V
Susunan tutorial dan poin pembelajaran utama
Instruksi dasar dan konsep prosesor
- Status prosesor: memahami program counter (pc), 31 register serbaguna (x1~x31), dan register nol khusus (x0)
- Instruksi aritmetika: mempelajari operasi penjumlahan/pengurangan dan perilaku overflow melalui
add,addi,sub, dan lainnya - Operasi bit: praktik operasi logika tingkat bit dan instruksi shift seperti
and,or,xor,sll,srl,sra - Instruksi perbandingan: menggunakan
slt,sltu, dan lainnya untuk membangun logika perbandingan integer bertanda/tanpa tanda serta evaluasi kondisi
Alur kontrol dan memori
- Branch dan jump: mekanisme percabangan bersyarat/tanpa syarat dan pemanggilan fungsi menggunakan
beq,bne,blt,jal,jalr, dan lainnya - Akses memori: operasi load/store tingkat word/halfword/byte melalui instruksi
lw,sw,lb,lh,sb,sh - Memory-mapped I/O: memahami cara berkomunikasi dengan perangkat eksternal melalui baca/tulis ke alamat tertentu
- Kode independen lokasi: teknik menulis kode yang dapat direlokasi menggunakan instruksi
auipcdan pengalamatan relatif terhadap PC
Fungsi dan konvensi pemanggilan
- Alias register: peran
a0~a7(argumen),s0~s11(disimpan),t0~t6(sementara),ra(alamat kembali),sp(stack pointer), dan lainnya - Pengelolaan stack: pola penyimpanan register saat masuk fungsi, alokasi/dealokasi ruang stack, serta penyimpanan dan pemulihan alamat kembali
- Fungsi rekursif: praktik panggilan rekursif dan pengelolaan stack frame melalui implementasi deret Fibonacci
Arsitektur privileged dan sistem operasi
- Level privileged: perbedaan antara mode Machine (level 3) dan mode User (level 0) serta mekanisme isolasinya
- Instruksi CSR: membaca/menulis register kontrol serta memanipulasi bit field dengan
csrrw,csrrs,csrrc, dan lainnya - Penanganan exception: memeriksa informasi exception dan menulis handler menggunakan CSR
mcause,mepc,mtval,mstatus - Peralihan mode: masuk dan kembali dari mode User dengan instruksi
mret, serta context switching menggunakanmscratch
Proyek akhir: OS sangat kecil
- Implementasi system call: melakukan trap dari mode User ke mode Machine dengan instruksi
ecalluntuk menyediakan fungsi putchar/exit - Simpan/pulihkan register: struktur lengkap trap handler yang mencadangkan dan memulihkan semua register serbaguna ke/dari stack
- Logika penanganan exception: membedakan penyebab exception dengan
mcause, melakukan dispatch berdasarkan nomor system call (a7), serta mencetak pesan error - Kode yang dapat dijalankan: menyediakan kode lengkap untuk masuk/keluar kernel OS yang dapat langsung dijalankan di emulator web
Referensi dan lisensi
- Tutorial dan kodenya sama-sama berada di bawah CC0 public domain atau lisensi BSD 0-clause
- Naskah asli dan repositori kode: https://github.com/dramforever/easyriscv
- Cocok untuk pembelajaran RISC-V, pendidikan, penelitian, dan pembangunan lingkungan simulasi
2 komentar
Wow
Saya jadi tertarik pada assembly RISC-V yang dipelajari di kelas jurusan saya.. bahkan ketika ingin membeli buku secara terpisah, yang terlihat hanya arsitektur ARM dan tidak ada RISC-V, jadi saya sempat bingung harus melihat apa, tetapi sepertinya saya menemukan sumber yang sangat bagus untuk belajar
Terima kasih!!!
Komentar Hacker News
Panduannya benar-benar bagus
Akan lebih baik kalau layar emulator pertama “My first RISC-V assembly program” diletakkan di bagian paling awal panduan. Kalau tidak, pembaca bisa salah paham dan mengira ini hanya pengantar berbasis teks meskipun judulnya menyebut ‘interactive’
Saya berencana meluangkan beberapa hari lagi untuk ini. Saya cukup tertarik pada RISC-V dan merasa ia punya masa depan yang cerah
Kalau ada ahli AI yang membaca ini, akan sangat keren kalau seseorang membuat ulang Core War dalam assembly RISC-V lewat platform seperti Replit atau Lovable
Saya belajar assembly dari Computer Organization And Design karya Patterson dan Hennessy, dan terasa sekali betapa banyak yang diambil RISC-V dari MIPS
Kedua ISA itu melibatkan orang-orang yang sama, dan mereka menghindari kesalahan seperti delay slot di MIPS. Kalau punya pengalaman dengan MIPS, assembly RISC-V rasanya hampir sama
Belakangan saya juga sedang melihat AArch64, dan meskipun tidak serapi RISC-V, desain praktisnya cukup mengesankan. Malah kadang saya merasa RISC-V mungkin dirancang terlalu konservatif
Saya pernah menulis sendiri TCP Socket in RISC-V Assembly
Saya memakai ISA RV64I, dan perlu memahami konsep linker relaxation. Saya juga menyertakan bahan referensi
Sepertinya ada kesalahan di bagian Position Independence
Saya penasaran apakah agar menghasilkan 0x3004, kode contohnya seharusnya memakai
luialih-alihauipcluimembuat alamat absolut, sedangkan kombinasiauipc/addimembuat alamat independen posisi. Kalauauipcberada di alamat 0 hasilnya memang sama, tetapi dalam praktiknya nilainya ditambahkan ke alamat instruksi saat iniSusunan interaktif dari konten ini benar-benar luar biasa
Sebagai pengembang C/C++, saya selalu merasa assembly itu sulit, tetapi dengan pendekatan seperti ini semuanya jadi jauh lebih jelas
load4alih-alihlw, ataujumpalih-alihj; ini bukan zaman kartu plong lagi, jadi saya tidak paham kenapa semuanya harus sependek iniTulisan ini membuat saya ingin kembali mencoba pemrograman level rendah
Saat kuliah mekatronika saya pernah menangani mikrokontroler dengan C dan assembly, tetapi sekarang saya sudah berpindah ke pengembangan web
Saya penasaran apakah ada referensi tepercaya untuk mempelajari perangkat keras RISC-V. Kalau bisa saya ingin mencobanya dengan Rust
Dulu juga ada tutorial OS berbasis Rust, tetapi saya tidak bisa menemukan tautannya sekarang
Kalau ingin perangkat keras sungguhan, saya merekomendasikan neorv32 — dokumentasinya bagus: dokumentasi resmi, repositori GitHub. Ini adalah core RISC-V yang ditulis dalam VHDL
Perangkat keras RISC-V mudah didapat
Lihat RISC-V on Raspberry Pi Pico 2
Lihat halaman Kickstarter
Kalau ingin sekaligus bermain dengan RISC-V dan FPGA, ada juga PolarFireSoC. Jauh lebih murah dan cukup layak dipakai dibanding AMD/Xilinx. Lingkungan pengembangannya memang agak jadul tapi cepat, dokumentasinya tersebar di mana-mana, tetapi sebagian besar tetap bisa ditemukan
tautan kit pengembangan
Yang lucu, papan pengembangnya lebih murah daripada chip-nya sendiri
Kebetulan minggu ini di kelas C saya baru masuk ke bab pengantar assembly, dan saya sempat berpikir bahwa belajar dengan RISC-V bisa menghindari masalah perbedaan CPU
Ternyata seseorang sudah lebih dulu merapikannya dengan sempurna dalam bentuk materi seperti ini. Terima kasih banyak
Pada contoh “jika dikurangkan dari 0 hasilnya menjadi negatif”, nilai negatif dari 0x123 adalah 0xfffffedd
Dikatakan emulator menampilkan 0xfffffccd, tetapi sebenarnya 0xfffffedd yang benar. Saya hitung sendiri, dan emulatornya memang akurat
Jika mencari emulator RISC-V yang bagus, saya merekomendasikan RARS