Izvo zvaunoda kuti utange hurongwa muRISC-V assembler

Kugadziridza kwekupedzisira: 08/10/2025
munyori: Isaac
  • Inonzwisisa RV32I: marejista, ABI uye kuyerera kwekutonga ne ecall.
  • Dzidzira neJupiter uye maekisesaizi: zvakaipa, zvinhu, maketani, kudzokorora.
  • Master cross toolchain, chinyorwa kubatanidza uye kugadzirisa ne objdump.

RISC-V Assembler: Zvinodiwa uye Kutanga

Kana iwe uchida kuziva nezve assembler uye uchinzwa kuti RISC-V ndiyo nzira yekuenda, wauya kunzvimbo chaiyo. Kutanga neASM paRISC-V inodhura zvakanyanya kupfuura zvinoita Kana iwe uchinzwisisa zvishandiso, muenzaniso we programming uye mimwe mitemo inokosha yezvivakwa.

Mumitsetse inotevera ndakabatanidza akanakisa ezvakawanda masosi: maitiro neJupiter mhando simulators, magungano eRV32I base repertoire, loop uye recursion mienzaniso, nharembozha, uye kunyange kutarisa RISC-V CPU dhizaini muVHDL (ine ALU, ndangariro control, uye mamiriro muchina), pamwe nekudzokorora kwemuchinjikwa-toolchain uye kubatanidza zvinyorwa.

Chii chinonzi RISC-V assembler uye chakasiyana sei nemutauro wemuchina?

Kunyangwe ese ari maviri akabatanidzwa kune iyo Hardware, Mutauro wemuchina ibhinari yakachena (mimwe uye zero) iyo CPU inodudzira zvakananga, nepo muunganidzi achishandisa mnemonics uye zviratidzo zvinoverengeka kupfuura assembler zvobva zvaturikira kuita binary.

RISC-V inotsanangura ISA yakavhurika ine yakachena kwazvo base repertoire. Iyo RV32I (32-bit) mbiri inosanganisira makumi matatu nemapfumbamwe mirairo yemushandisi ine inoshamisa orthogonality, kupatsanura ndangariro kuwana kubva kwakachena computation, uye nerutsigiro rwakanyanya muGCC/LLVM.

Zvinyorwa, zvibvumirano uye nzvimbo yekupinda

MuRV32I mune 32 marejista echinangwa (x0–x31) 32-bit; x0 inogara ichiverengwa se0 uye haigone kunyorerwa. Mazita akadai sea0–a7 (nharo), t0–t6 (nguva pfupi), kana s0–s11 (akachengetedzwa) anobatsirawo pakutevera ABI.

Zvichienderana nemhoteredzo kana simulator, chirongwa chinogona kutanga pane yakatarwa label. MuJupiter, zvirongwa zvinotangira paglobal __start tag..

ari ma tag anopera mukoroni, unogona kungoisa rairo imwe pamutsara uye makomendi anogona kutangwa ne# kana ; saka muunganidzi anovafuratira.

Zvishandiso uye Simulators: Jupiter uye Basic Workflow

Kudzidzira pasina matambudziko, une Jupiter simulator / muunganidzi, graphical tool yakafuridzirwa neSPIM/MARS/VENUS inofambisa kugadzirisa, kuungana uye kuita munzvimbo imwe chete.

MuJupiter unogona kugadzira, kugadzirisa uye kudzima mafaera muEditor tab. Mushure mekuchengetedza, unganidza neF3 uye mhanya kugadzirisa mirairo yekuyerera nekuraira, uchishandisa rejista uye maonero ekurangarira kuti unzwisise mamiriro emuchina.

Zvirongwa zvinofanirwa kupera nekufona kune zvakatipoteredza: kubuda kufona kuseta a0 nekodhi 10 (exit). MuRISC-V, maecalls akaenzana nehurongwa hwekufona kana misungo kune zvakatipoteredza/system.

Minimum chimiro chechirongwa uye system inofona

Iyo yakajairika chimiro mumienzaniso yezvidzidzo inotsanangura pekutangira, inoita basa, uye inopera ne ecall. ecall nharo dzinowanzo famba mu a0–a2 uye sarudzo yebasa mua7, zvichienderana nenharaunda.

Mune Linux RISC-V, semuenzaniso, unogona kudhinda nekunyora syscall uye kubuda nekodhi yakakodzera. Pakunyora a0 (fd), a1 (buffer), a2 (kureba) uye a7 anoshandiswa nenhamba yebasa.. Pakupedzisira, a0 inogadzirirwa kodhi yekudzoka uye a7 kune nhamba yekubuda.

# 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"

Kana ukashanda kunze kweLinux, senge in ekudzidzisa simulators ane yavo IoT sevhisi, shandura iyo ecall nhamba uye marejista zvinoenderana nemamiriro ekunze zvinyorwa.

  Tora Windows 8.1 ISO Files [USB uye DVD Setup]

Maekisesaizi ekutanga ekukubatsira kuti ugadzikane nemamiriro, zvishwe, uye ndangariro

Kudziya kwemazuva ese ndeyekuona kana nhamba isina kunaka. Unogona kudzorera 0 kana ari positive uye 1 kana ari negative.; neRV32I, kuenzanisa ne0 uye set-on-shoma-pane inogadzirisa nyaya murairo imwechete yakanyatsofungwa.

Chimwe chiitwa chinobatsira zvikuru kunyora zvinhu zvenhamba: inoyambuka kubva pa1 kuenda kun, inodhinda kupatsanura, uye inodzosera kuti vanganiIwe unodzidzira matavi ane zvirevo, kupatsanura (kana kudzokorora kubvisa), uye zvishwe nekuwedzera uye kuenzanisa.

Kushanda netambo kunokumanikidza kubata ndangariro: Shanyira mavara ega ega etambo mundangariro uye munzvimbo-nzvimbo shandura mavara madiki kuita makuru kana dzakakwana mukati meiyo ASCII renji. Kana yapedza, inodzorera kero yepakutanga yetambo.

Loops, mabasa uye kudzokorora: factorial, Fibonacci uye Shongwe yeHanoi

Paunenge uchigadzira zvishwe, funga nezvezvivharo zvitatu: mamiriro, muviri, uye nhanho. Iine beq/bne/bge uye kusvetuka zvisina magumo jal/j apo/kuvakwa pasina chakavanzika, kuvimba neadhi uye kuenzanisa.

.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

Mukuita mafoni, remekedza iyo ABI: chengetedza kana uchizobatanidza mamwe mafoni, inochengetedza s0–s11 kana ukaishandura, uye inoshandisa staki ine sp inofamba mukuwanda kwezwi.

Factorial ndiyo yemhando yekudzokorora: base case n==0 inodzosa 1; kana zvisina kudaro, fonera factorial(n-1) uye wedzera ne n. Chengetedza ra uye marejista akachengetwa pachitunha usati wafona uye wodzoreredza pakudzoka.

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 inobatsira pakudzidzira zvese recursion nemacall maviri seshanduro inoshanda iterative ine accumulator variables. Uye kana iwe uchida dambudziko nekuyerera uye parameter control, shandura mhinduro kuassembler Towers of Hanoi nenharo ina: dhisiki, tsime, nzvimbo, uye shongwe yebetsero; inoremekedza kurongeka kwekufona uye inoratidza mafambiro ega ega.

Memory kuwana, arrays, uye tambo manipulation

MuRISC-V, kupinda mundangariro kunoitwa nemutoro/chitoro: lw/sw yemashoko, lh/sh yehafu yemazwi, uye lb/sb yemabhaiti, ine misiyano yakasainwa kana isina kusaina mumhosva (lb vs lbu, lh vs lhu).

  Project Zomboid pa Android: Unogona kuiridza panharembozha?

Kuti uyambuke nhamba dzakakwana, shandisa 4-byte offsets per index; zvema text strings, inofambisira mberi byte kusvika yawana terminator kana gungano richida (semuenzaniso, \0). Rangarira kuchengetedza base kero uye kubata anonongedzera neadi/auipc/la sezvazvinokodzera.

Kugadzira RV32I CPU kubva kuScratch: A High-Level Overview

Kana iwe uchinzwa kuda kuenda pasi kune silicon, chirongwa chekudzidzisa chinovaka a RV32I CPU muVHDL, inogadzirwa muFPGA Yakaderera-yepakati renji. Inosanganisira chirongwa ROM, data RAM, uye iri nyore GPIO yekuvhenekesa LED.

Iyo kernel inoshandisa iyo base repertoire (isina M / A / C yekuwedzera kana CSRs), inoshandisa 32-bit kero bhazi uye inobvumira 8-/16-/32-bit sign-yakawedzerwa ndangariro kuwana pazvinenge zvakakodzera. Iyo dhizaini inoparadzanisa zvakajeka marejista, ALU, memory controller, uye muchina wehurumende.

ALU, shanduko, uye pfungwa ye "kunonoka kurodha"

Iyo ALU inotsanangurwa pamwe chete nema operation akadai kuwedzera, kubvisa, XOR, OR, UYE, kuenzanisa (yakasaina uye isina kusaina) uye zvine musoro/arithmetic kuchinja.

Kuchengetedza LUTs muFPGA, akawanda-bit machinjiro anoitwa iterating 1-bit shift inodzorwa nemuchina wehurumende: iwe unoshandisa akati wandei kutenderera, asi unoderedza zvine musoro zviwanikwa.

Mumaseketi anowirirana, shanduko dzinoonekwa pamicheto yewachi. Pfungwa ye "kunonoka mutoro" inorangarira kuti izvo zvinosarudzwa nemultiplexer zvinokanganisa rejista mune inotevera kutenderera., chinhu chakakosha pakugadzira iyo fetch-decode-execute state muchina.

Memory controller uye mepu: ROM, RAM uye GPIO

Memory block inobatanidza ROM uye RAM munzvimbo inobatana, kurerutsa iyo processor interfaceMutongi anogamuchira AddressIn (32 bits), DataIn, hupamhi (byte / hafu / izwi), chiratidzo chekuwedzera chiratidzo, WE (verenga / nyora), uye Tanga kutanga kutengeserana.

Kana oparesheni yapera, ReadyOut yakaiswa ku1 uye, kana yaverengwa, DataOut ine data (saina-yakawedzerwa kana yakumbirwa). Kana zvakanyorwa, iyo data inoramba iri mu RAM.

Muenzaniso wemepu inoshanda: ROM kubva 0x0000 kusvika 0x0FFF, GPIO byte pa0x1000 (bit 0 kusvika pini) uye RAM kubva 0x1001 kusvika 0x1FFFNeizvi iwe unogona kuita blinker nekunyora uye toggling iyo inobuda bit.

Marejista, multiplexers uye nyika michina

Iyo CPU inotsanangura makumi matatu nemaviri chinangwa marejista akasimbiswa ane arrays muVHDL, ane a decoder kusarudza nzvimbo yekunyora kubva kuALU uye kuchengeta zvimwe.

Multiplexers inotonga ALU mapimendi (operands uye mashandiro), zviratidzo kune chidzori chendangariro (hupamhi, kero, tanga kudzora uye kuverenga / kunyora) uye akakosha marejista: PC, IR uye yekubatsira counter yezvekuchinja mashifiti.

Muchina wehurumende unotanga Dzokerazve, inotora rairo inongedzerwa nePC (4-byte kuverenga), inotakurwa muIR kana yakagadzirira uye ichipfuura kune ekuuraya node: ALU (imwe kuraira mu1 kutenderera kunze kwekuchinja), mutoro / chitoro, matavi uye kusvetuka, kuwedzera kune yakakosha mirairo senge ebreak.

  Maitiro ekuseta Bluetooth mukati Windows 10

Cross-toolchain, kubatanidza, uye kugadzirisa

Kugadzira RV32I mabhinari, shandisa a Muchinjikwa GCC (chinangwa riscv32-hapana-elf). Iwe unounganidza C/C++/ASM masosi, batanidza ne script inotsanangura mepu yekurangarira, uye shandura iyo inobuda kuita fomu yako ROM/FPGA inotarisira.

A simple hook script anogona kuisa .text muROM kubva ku0x0000 uye .data mu RAM kubva ku0x1004 (kana 0x1000–0x1003 inogarwa neGPIO rejista). Iyo yekutanga maitiro inogona kuve "yakashama" uye isa iyo stack pointer pakupera kwe RAM (e.g. 0x1FFC) vasati vafona main.

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

Ne riscv32-hapana-elf-objdump unogona disassemble ELF uye tarisa kero; semuenzaniso, iwe uchaona iyo bhutsu pa0x00000000 nemirayiridzo yakaita selui/addi/jal uye shanduko kune yako huru. YeVHDL simulation, GHDL inogadzira zviteshi zvaunogona kuvhura neGtkWave.

Mushure mekusimbisa mukuenzanisa, tora dhizaini kune FPGA (Quartus kana imwe toolchain). Kana RAM ichinzi sezvivharo zvemukati uye kodhi iri pachena RTL, iwe unofanirwa synthesize pasina zvinoshamisa, kunyangwe pane veteran zvishandiso.

Zviyeuchidzo zvinoshanda uye zvikanganiso zvinowanzoitika kana uchitanga

Usakanganwa izvozvo x0 inogara iri zero; kuinyorera hakuna zvakunoita, uye kuiverenga kunodzosa 0. Shandisa izvi kune zvakanakira iwe muwedzero, kuenzanisa, uye kuchenesa registry.

Paunoshandisa maitiro, chengetedza ra uye sN zvinyorwa zvaunogadzirisa, uye inogadzirisa stack nemashoko-anoenderana nekuwedzera/kubvisa kune sp. Pakudzoka, inodzoreredza mune reverse kurongeka uye inosvetuka najr ra.

Mune simulators seJupiter, tarisa izvozvo __start is global and unoipedza ne ecall zvakarurama (a0=10 kubuda). Kana chimwe chinhu chikasatanga, tarisa iyo label, the globality uye recompile (F3).

Mukudzidzira neIO, remekedza protocol yezvakatipoteredza: iyo marejista anotakura paramita, nhamba yebasa, uye kana kero kana kukosha kwekukurumidza kunotarisirwa. Shandisa iyo simulator kana yekushandisa system zvinyorwa.

Iine yakajeka ISA base (RV32I, marejista uye ABI), yakagadzika simulator seJupiter, uye inowedzera mienzaniso (yakashata, zvinhu, uppercase, loops, factorial, Fibonacci neHanoi), iyo RISC-V assembler inomira kuve madziro uye inova ine muto terrain kuti unzwisise kuti CPU inofunga sei. Uye kana iwe ukashinga kudzika kuVHDL, iwe uchaona kuti ALU, ndangariro uye kutonga zvinobatana sei.: kubva mukuraira kunotora uye kusimbe kurodha kuenda kundangariro nzvimbo uye mepu ine ROM, RAM, uye GPIO inoita kuti ubwaire LED neako processor.

Izvo Zvirongwa Zvakanakisisa zveChirongwa
Nyaya inoenderana:
Iwo 7 Akanakisa Zvirongwa zveChirongwa