Untuk menulis dan menjalankan kode Assembly RISC-V di komputer kita yang menggunakan arsitektur berbeda (seperti Intel atau AMD), kita membutuhkan cross-compiler (penerjemah kode) dan emulator (simulator mesin).

1. Persiapan Tools dan Lingkungan#

Sangat disarankan untuk menggunakan sistem operasi Linux (Ubuntu/Debian). (Catatan: Jika Anda pengguna Windows, Anda bisa menggunakan WSL 2 (Windows Subsystem for Linux) untuk mengikuti panduan ini).

Buka terminal Linux Anda dan jalankan perintah berikut untuk memperbarui daftar paket dan menginstal semua kebutuhan:

sudo apt update
sudo apt install binutils-riscv64-linux-gnu gcc-riscv64-linux-gnu qemu-user

Penjelasan singkat tentang tools yang diinstal:

  • binutils-riscv64-linux-gnu: Kumpulan alat inti (termasuk assembler dan linker) untuk mengubah file teks assembly menjadi bahasa mesin RISC-V mentah.
  • gcc-riscv64-linux-gnu: Kompilator C/C++ (opsional untuk saat ini, tapi sangat berguna jika Anda ingin menggabungkan kode C dengan Assembly ke depannya).
  • qemu-user: Emulator yang memungkinkan OS Linux biasa (x86_64) untuk menjalankan program berformat biner RISC-V seolah-olah berjalan di mesin aslinya.

2. Membuat Project Pertama#

Mari kita buat program sederhana untuk memastikan semua tools berfungsi. Kita akan membuat program “Hello World!”.

Siapkan ruang kerja yang rapi dengan membuat direktori baru:

mkdir riscv_project && cd riscv_project

Buat file bernama hello.s menggunakan teks editor pilihan Anda (nano, vim, atau VS Code), lalu masukkan kode standar Linux RISC-V berikut:

.data
hello:
    .ascii "Hello World!\n"  # Isi pesan yang mau dicetak

.text
.global _start

_start:
    # --- Cetak Pesan ---
    li a0, 1               # Ke mana? Terminal (stdout)
    la a1, hello           # Apa? Ambil teks 'hello'
    li a2, 13              # Berapa? 13 karakter
    li a7, 64              # Pakai fungsi 'write'
    ecall                  # Gass!

    # --- Keluar ---
    li a0, 0               # Status: Aman (0)
    li a7, 93              # Pakai fungsi 'exit'
    ecall                  # Selesai

1. Blok Data (.data)#

Di sinilah tempat kita menaruh “barang-barang” yang akan digunakan program.

  • .data: Memberitahu komputer bahwa bagian ini berisi data statis, bukan perintah jalan.
  • hello:: Ini adalah Label. Anggap saja seperti alamat rumah atau nama variabel agar kita mudah memanggil data tersebut nanti.
  • .ascii "...": Perintah untuk menyimpan urutan karakter ke dalam memori. Simbol \n adalah newline (baris baru).

2. Blok Instruksi (.text & .global)#

Ini adalah bagian “otak” atau daftar perintah.

  • .text: Menandakan bahwa baris-baris setelah ini adalah instruksi yang harus dijalankan oleh prosesor.
  • .global _start: Tanpa baris ini, sistem operasi (Linux) akan bingung harus mulai menjalankan perintah dari baris yang mana. Ini menetapkan titik awal program.

3. Logika Menampilkan Pesan (Write Syscall)#

Dalam Assembly Linux, kita tidak bisa langsung “mencetak”. Kita harus meminta bantuan kernel (inti OS) melalui sistem yang disebut Syscall.

  • li a0, 1: li (Load Immediate) mengisi register a0 dengan angka 1. Dalam standar Linux, angka 1 berarti Standard Output (layar).
  • la a1, hello: la (Load Address) mengambil alamat memori di mana teks “Hello World” disimpan dan menaruhnya di a1.
  • li a2, 13: Kita harus jujur pada komputer berapa banyak karakter yang mau dicetak. Teks “Hello World!\n” totalnya ada 13 karakter.
  • li a7, 64: Ini adalah nomor pesanan. Di Linux RISC-V, nomor 64 adalah kode untuk fungsi write.
  • ecall: Singkatan dari Environment Call. Ini seperti mengetuk pintu kantor Kernel OS dan berkata, “Tolong kerjakan perintah nomor 64 dengan data yang ada di register a0, a1, dan a2!”

4. Logika Keluar (Exit Syscall)#

Program Assembly tidak akan berhenti sendiri. Jika tidak “diusir” keluar, ia akan terus mencoba membaca memori kosong dan akhirnya crash (Segfault).

  • li a0, 0: Memberikan status 0 kepada OS, yang artinya “Program selesai dengan sukses/normal”.
  • li a7, 93: Nomor pesanan 93 di Linux RISC-V adalah kode untuk fungsi exit.
  • ecall: Mengetuk pintu kernel terakhir kalinya untuk pamit dan menutup program secara bersih.

3. Menjalankan Kode#

Ada tiga tahap utama yang terjadi di balik layar untuk mengubah file teks .s menjadi program yang hidup. Jalankan perintah ini secara berurutan di terminal:

1. Assembly (Perakitan) Mengubah kode teks .s menjadi object file .o (kode mesin mentah yang belum terstruktur).

riscv64-linux-gnu-as -o hello.o hello.s

2. Linking (Penyambungan) Menyusun file .o menjadi executable (file biner yang siap dijalankan oleh sistem operasi).

riscv64-linux-gnu-ld -o hello hello.o

3. Execution (Eksekusi) Karena file hello ini memiliki arsitektur RISC-V, kita tidak bisa langsung menjalankannya seperti program biasa. Kita memerlukan QEMU untuk menerjemahkannya.

qemu-riscv64 ./hello

Hasil Akhir: Jika terminal Anda memunculkan teks Hello World!, selamat! Lingkungan pengembangan RISC-V Anda sudah siap sepenuhnya dan Anda bisa melangkah ke materi pembelajaran berikutnya.