Perkara yang anda perlukan untuk memulakan pengaturcaraan dalam pemasang RISC-V

Kemaskini terakhir: 08/10/2025
Pengarang Ishak
  • Memahami RV32I: daftar, ABI dan kawalan aliran dengan ecall.
  • Berlatih dengan Musytari dan latihan: negatif, faktor, rantai, rekursi.
  • Rantai alat silang induk, skrip memaut dan menyahpepijat dengan objdump.

RISC-V Assembler: Keperluan dan Bermula

Jika anda ingin tahu tentang pemasang dan merasakan bahawa RISC-V adalah cara untuk pergi, anda telah datang ke tempat yang betul. Bermula dengan ASM pada RISC-V adalah lebih berpatutan daripada yang kelihatan Jika anda memahami alat, model pengaturcaraan dan beberapa peraturan utama seni bina.

Dalam baris berikut saya telah menggabungkan yang terbaik daripada beberapa sumber: amalan dengan simulator jenis Musytari, konvensyen repertoir asas RV32I, contoh gelung dan rekursi, panggilan sistem dan juga melihat reka bentuk CPU RISC-V dalam VHDL (dengan ALU, kawalan memori dan mesin keadaan), serta semakan rantai alat silang dan skrip pemautan.

Apakah pemasang RISC-V dan bagaimana ia berbeza daripada bahasa mesin?

Walaupun kedua-duanya melekat pada perkakasan, Bahasa mesin ialah binari tulen (satu dan sifar) yang ditafsirkan CPU secara langsung, manakala penghimpun menggunakan mnemonik dan simbol lebih mudah dibaca daripada pemasang kemudian diterjemahkan ke dalam binari.

RISC-V mentakrifkan ISA terbuka dengan repertoir asas yang sangat bersih. Profil RV32I (32-bit) termasuk 39 arahan pengguna dengan ortogonal yang luar biasa, memisahkan akses memori daripada pengiraan tulen, dan dengan sokongan yang sangat baik dalam GCC/LLVM.

Rekod, perjanjian dan titik masuk

Dalam RV32I anda ada 32 daftar tujuan am (x0–x31) 32-bit; x0 sentiasa dibaca sebagai 0 dan tidak boleh ditulis. Alias ​​seperti a0–a7 (argumen), t0–t6 (sementara), atau s0–s11 ​​​​(disimpan) juga berguna untuk mengikuti ABI.

Bergantung pada persekitaran atau simulator, program mungkin bermula pada label tertentu. Di Musytari, program bermula pada teg __start global., yang anda mesti isytiharkan sebagai kelihatan (contohnya, dengan .globl) untuk menandakan titik masuk.

yang tag berakhir dengan titik bertindih, anda hanya boleh meletakkan satu arahan setiap baris dan ulasan boleh dimulakan dengan # atau ; jadi penghimpun mengabaikannya.

Alat dan Simulator: Musytari dan Aliran Kerja Asas

Untuk berlatih tanpa komplikasi, anda mempunyai Simulator/pemasang Musytari, alat grafik yang diilhamkan oleh SPIM/MARS/VENUS yang memudahkan penyuntingan, pemasangan dan pelaksanaan dalam satu persekitaran.

Dalam Musytari anda boleh membuat, mengedit dan memadam fail dalam tab Editor. Selepas menyimpan, pasang dengan F3 dan jalankan untuk nyahpepijat arahan aliran mengikut arahan, menggunakan daftar dan paparan memori untuk memahami keadaan mesin.

Program mesti berakhir dengan panggilan kepada alam sekitar: keluar tetapan panggilan a0 dengan kod 10 (keluar). Dalam RISC-V, panggilan panggilan adalah bersamaan dengan panggilan sistem atau perangkap kepada persekitaran/sistem.

Struktur minimum program dan panggilan sistem

Struktur tipikal dalam contoh akademik mentakrifkan titik permulaan, melakukan kerja, dan berakhir dengan panggilan. hujah ecall biasanya bergerak dalam a0–a2 dan pemilih perkhidmatan dalam a7, bergantung pada persekitaran.

Dalam satu Linux RISC-V, sebagai contoh, anda boleh mencetak dengan syscall tulis dan keluar dengan kod yang sesuai. Untuk menulis a0 (fd), a1 (penampan), a2 (panjang) dan a7 digunakan dengan nombor perkhidmatan. Akhirnya, a0 ditetapkan kepada kod pulangan dan a7 kepada nombor keluar.

# Ejemplo mínimo (Linux RISC-V) para escribir y salir
.global _start
_start:
  addi a0, x0, 1        # fd = 1 (stdout)
  la   a1, msg          # a1 = &msg
  addi a2, x0, 12       # a2 = longitud
  addi a7, x0, 64       # write
  ecall

  addi a0, x0, 0        # return code
  addi a7, x0, 93       # exit
  ecall

.data
msg: .ascii "Hola mundo\n"

Jika anda bekerja di luar Linux, seperti dalam simulator pendidikan dengan perkhidmatan IoT mereka sendiri, tukar nombor ecall dan daftar mengikut dokumentasi persekitaran.

  Dapatkan Fail ISO Windows 8.1 [Persediaan USB dan DVD]

Latihan awal untuk membantu anda berasa selesa dengan syarat, gelung dan ingatan

Pemanasan biasa adalah untuk mengesan sama ada integer adalah negatif. Anda boleh mengembalikan 0 jika ia positif dan 1 jika ia negatif.; dengan RV32I, perbandingan dengan 0 dan set-on-kurang-daripada menyelesaikan isu dalam satu arahan yang difikirkan dengan baik.

Satu lagi latihan yang sangat berguna ialah menyenaraikan faktor nombor: melintasi dari 1 hingga n, mencetak pembahagi, dan mengembalikan bilangan yang adaAnda akan berlatih cawangan bersyarat, pembahagian (atau penolakan berulang), dan gelung dengan penambahan dan perbandingan.

Bekerja dengan rentetan memaksa anda mengurus memori: Lawati setiap aksara rentetan dalam ingatan dan tukarkan huruf kecil kepada huruf besar di tempatnya jika ia sesuai dalam julat ASCII. Setelah selesai, ia mengembalikan alamat asal rentetan.

Gelung, fungsi dan rekursi: faktorial, Fibonacci dan Menara Hanoi

Apabila mereka bentuk gelung, fikirkan tiga blok: keadaan, badan dan langkah. Dengan beq/bne/bge dan lompatan tanpa syarat jal/j while/for dibina tanpa misteri, bergantung pada addi dan perbandingan.

.text
.globl __start
__start:
  li t0, 0        # i
  li t1, 10       # max
cond:
  bge t0, t1, end # si i >= max, salta
  # cuerpo: usar a0/a1 segun servicio IO del entorno
  addi t0, t0, 1  # i++
  j cond
end:
  li a0, 10
  ecall

Dalam panggilan fungsi, hormati ABI: simpan jika anda akan membuat lebih banyak panggilan, mengekalkan s0–s11 ​​​​jika anda mengubah suainya dan menggunakan timbunan dengan sp bergerak dalam gandaan perkataan.

Faktorial ialah rekursi klasik: huruf asas n==0 mengembalikan 1; jika tidak, panggil faktorial(n-1) dan darab dengan n. Lindungi ra dan daftar yang disimpan pada timbunan sebelum panggilan dan pulihkannya apabila kembali.

factorial:
  beq a0, x0, base
  addi sp, sp, -8
  sw   ra, 4(sp)
  sw   s0, 0(sp)
  mv   s0, a0
  addi a0, a0, -1
  jal  factorial
  mul  a0, a0, s0
  lw   s0, 0(sp)
  lw   ra, 4(sp)
  addi sp, sp, 8
  jr   ra
base:
  li a0, 1
  jr ra

Fibonacci berguna untuk mengamalkan kedua-duanya rekursi dengan dua panggilan sebagai versi lelaran yang cekap dengan pembolehubah akumulator. Dan jika anda mahukan cabaran dengan kawalan aliran dan parameter, terjemah penyelesaian kepada pemasang Menara Hanoi dengan empat hujah: cakera, sumber, destinasi dan menara tambahan; ia menghormati perintah panggilan dan memaparkan setiap pergerakan.

Akses memori, tatasusunan dan manipulasi rentetan

Dalam RISC-V, akses memori dilakukan dengan memuatkan/simpan: lw/sw untuk perkataan, lh/sh untuk halfwords dan lb/sb untuk bait, dengan varian yang ditandatangani atau tidak ditandatangani dalam pertuduhan (lb vs lbu, lh vs lhu).

  Projek Zomboid pada Android: Bolehkah anda memainkannya di telefon bimbit?

Untuk merentasi tatasusunan integer, gunakan offset 4-bait bagi setiap indeks; untuk rentetan teks, memajukan bait demi bait sehingga ia menemui penamat jika konvensyen memerlukannya (cth., \0). Ingat untuk menyimpan alamat asas dan mengendalikan penunjuk dengan addi/auipc/la yang sesuai.

Mereka bentuk CPU RV32I dari Scratch: Gambaran Keseluruhan Tahap Tinggi

Jika anda rasa ingin turun ke silikon, projek pendidikan membina a CPU RV32I dalam VHDL, boleh disintesis dalam FPGA Julat pertengahan rendah. Termasuk ROM program, RAM data dan GPIO ringkas untuk menyalakan LED.

Kernel melaksanakan repertoir asas (tanpa sambungan M/A/C atau CSR), menggunakan bas alamat 32-bit dan membenarkan akses memori lanjutan tanda 8-/16-/32-bit jika sesuai. Reka bentuk dengan jelas memisahkan daftar, ALU, pengawal memori, dan mesin keadaan.

ALU, anjakan, dan idea "pemuatan tertunda"

ALU diterangkan secara gabungan dengan operasi seperti penambahan, penolakan, XOR, ATAU, DAN, perbandingan (ditandatangani dan tidak ditandatangani) dan anjakan logik/aritmetik.

Untuk menyimpan LUT dalam FPGA, anjakan berbilang bit dilaksanakan lelaran anjakan 1-bit dikawal oleh mesin keadaan: anda menggunakan beberapa kitaran, tetapi anda mengurangkan sumber logik.

Dalam litar segerak, perubahan diperhatikan pada tepi jam. Konsep "beban tertunda" mengingatkan bahawa apa yang dipilih oleh pemultipleks memberi kesan kepada daftar dalam kitaran seterusnya, aspek utama semasa mereka bentuk mesin keadaan fetch-decode-execute.

Pengawal memori dan peta: ROM, RAM dan GPIO

Blok memori mengintegrasikan ROM dan RAM ke dalam ruang bersebelahan, memudahkan antara muka pemprosesPengawal menerima AddressIn (32 bit), DataIn, lebar (bait/separuh/perkataan), isyarat sambungan tanda, WE (baca/tulis), dan Mula untuk memulakan transaksi.

Apabila operasi selesai, ReadyOut ditetapkan kepada 1 dan, jika ia telah dibaca, DataOut mengandungi data (tanda lanjutan apabila diminta). Jika ia ditulis, data kekal dalam RAM.

Contoh peta praktikal: ROM daripada 0x0000 hingga 0x0FFF, bait GPIO pada 0x1000 (bit 0 hingga pin) dan RAM daripada 0x1001 hingga 0x1FFFDengan ini anda boleh membuat kelip mata dengan menulis dan menogol bit output.

Daftar, pemultipleks dan mesin keadaan

CPU mentakrifkan 32 daftar tujuan umum yang dibuat dengan tatasusunan dalam VHDL, dengan a penyahkod untuk memilih destinasi tulis daripada ALU dan menyimpan selebihnya.

Multiplexer mengawal input ALU (operand dan operasi), isyarat kepada pengawal memori (lebar, alamat, kawalan mula dan baca/tulis) dan daftar khas: PC, IR dan kaunter tambahan untuk anjakan lelaran.

Mesin negeri bermula dengan menetapkan semula, mengambil arahan yang ditunjukkan oleh PC (bacaan 4-bait), ia dimuatkan ke dalam IR apabila sedia dan dihantar ke nod pelaksanaan: ALU (satu arahan dalam 1 kitaran kecuali untuk anjakan), muat/simpan, cawangan dan lompatan, sebagai tambahan kepada arahan khas seperti ebreak.

  Cara Menyediakan Bluetooth dalam Windows 10

Rantaian silang alat, pemautan dan penyahpepijatan

Untuk menjana binari RV32I, gunakan a Cross GCC (sasaran riscv32-none-elf). Anda menyusun sumber C/C++/ASM, memaut dengan skrip yang mentakrifkan peta memori dan menukar output kepada bentuk yang diharapkan oleh ROM/FPGA anda.

Skrip cangkuk mudah boleh diletakkan .teks dalam ROM daripada 0x0000 dan .data dalam RAM daripada 0x1004 (jika 0x1000–0x1003 diduduki oleh daftar GPIO). Rutin permulaan boleh "telanjang" dan letakkan penuding tindanan pada penghujung RAM (cth. 0x1FFC) sebelum memanggil utama.

/* Mapa simple
 * ROM: 0x00000000 - 0x00000FFF
 * GPIO: 0x00001000 - 0x00001003
 * RAM: 0x00001004 - 0x00001FFF
 */
SECTIONS {
  . = 0x00000000;
  .text : { *(.startup) *(.text) *(.text.*) *(.rodata*) }
  . = 0x00001004;
  .data : { *(.data) *(.data.*) }
}

Dengan riscv32-none-elf-objdump anda boleh buka ELF dan semak alamat; sebagai contoh, anda akan melihat boot pada 0x00000000 dengan arahan seperti lui/addi/jal dan peralihan ke utama anda. Untuk simulasi VHDL, GHDL menjana jejak yang boleh anda buka dengan GtkWave.

Selepas mengesahkan dalam simulasi, bawa reka bentuk ke FPGA (Quartus atau rantai alat lain). Jika RAM disimpulkan sebagai blok dalaman dan kod itu jelas RTL, anda harus mensintesis tanpa kejutan, walaupun pada peranti veteran.

Peringatan praktikal dan kesilapan biasa semasa bermula

Jangan lupa itu x0 sentiasa sifar; menulis kepadanya tidak mempunyai kesan, dan membacanya mengembalikan 0. Gunakan ini untuk kelebihan anda dalam penambahan, perbandingan dan pembersihan pendaftaran.

Apabila anda melaksanakan ciri, simpan rekod ra dan sN yang anda ubah suai, dan menguruskan tindanan dengan penambahan/penolakan sejajar perkataan kepada sp. Apabila kembali, ia dipulihkan dalam susunan terbalik dan melompat dengan jr ra.

Dalam simulator seperti Musytari, semak itu __start adalah global dan anda menamatkannya dengan ecall betul (a0=10 untuk keluar). Jika sesuatu tidak bermula, semak label, globaliti dan susun semula (F3).

Dalam latihan dengan IO, menghormati protokol alam sekitar: daftar yang membawa parameter, nombor perkhidmatan dan sama ada alamat atau nilai segera dijangkakan. Gunakan simulator atau dokumentasi sistem pengendalian.

Dengan asas ISA yang jelas (RV32I, daftar dan ABI), simulator yang selesa seperti Musytari, dan contoh yang semakin meningkat (negatif, faktor, huruf besar, gelung, faktorial, Fibonacci dan Hanoi), pemasang RISC-V berhenti menjadi dinding dan menjadi rupa bumi yang menarik untuk memahami cara CPU berfikir. Dan jika anda berani turun ke VHDL, anda akan melihat bagaimana ALU, memori dan kawalan sesuai bersama.: daripada pengambilan arahan dan pemuatan malas kepada antara muka memori dan peta dengan ROM, RAM dan GPIO yang membolehkan anda berkelip LED dengan pemproses anda sendiri.

Program Terbaik untuk Diprogramkan
artikel berkaitan:
7 Program Terbaik untuk Diprogramkan