Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

RISC V toolchain

Viktor Prutyanov edited this page Jan 5, 2025 · 16 revisions

Установка

Fedora

sudo yum install binutils-riscv64-linux-gnu
sudo yum install gcc-riscv64-linux-gnu

Ubuntu

sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu

Cборка программ на ассемблере RISC-V

Для примера возьмём следующую программу на ассемблере:

.text
.globl _start
.globl _finish
_start:
 li x5,11
 addi x7, x5,9
nop
 mv x11, x7
_finish:
nop

Будем предполагать, что она сохранена в файле addi.s. Теперь для сборки программы под RV32I нужно выполнить следующие действия:

  1. Создать объектный файл addi.o.
riscv64-linux-gnu-as -march=rv32i -mabi=ilp32 -c addi.s -o addi.o
  1. Создать исполняемый ELF-файл addi.out.
riscv64-linux-gnu-ld -melf32lriscv addi.o -o addi.out

Файл addi.out можно запускать в симуляторе RISC-V.

  1. Скопировать секцию кода в файл addi.bin.
riscv64-linux-gnu-objcopy -O binary addi.out addi.bin
  1. Превратить двоичный код в его текстовое представление addi.txt.
hexdump -v -e '"%08x\n"' addi.bin > addi.txt

Файл addi.txt можно использовать в директиве $readmemh.

Все 4 стадии можно объединить в один Makefile:

RISCV_PREFIX=riscv64-linux-gnu-
AS=$(RISCV_PREFIX)as
LD=$(RISCV_PREFIX)ld
OBJCOPY=$(RISCV_PREFIX)objcopy
OBJDUMP=$(RISCV_PREFIX)objdump
SRCS=$(wildcard *.s)
TXTS=$(SRCS:%.s=%.txt)
all: $(TXTS)
%.txt: %.bin
 hexdump -v -e '"%08x\n"' $^ > $@
%.bin: %.out
 $(OBJCOPY) -O binary $^ $@
%.out: %.o
 $(LD) -melf32lriscv $^ -o $@ && $(OBJDUMP) -d $@
%.o: %.s
 $(AS) -march=rv32i -mabi=ilp32 -c $^ -o $@
.PHONY: all clean
.PRECIOUS: %.o %.out %.bin
clean:
 rm -f *.o *.out *.bin *.txt

Тогда собрать addi.txt можно так:

$ make addi.txt
riscv64-linux-gnu-as -march=rv32i -mabi=ilp32 -c addi.s -o addi.o
riscv64-linux-gnu-ld -melf32lriscv addi.o -o addi.out && riscv64-linux-gnu-objdump -d addi.out
addi.out: file format elf32-littleriscv
Disassembly of section .text:
00010054 <_start>:
 10054:	00b00293 	li	t0,11
 10058:	00928393 	addi	t2,t0,9
 1005c:	00000013 	nop
 10060:	00038593 	mv	a1,t2
00010064 <_finish>:
 10064:	00000013 	nop
riscv64-linux-gnu-objcopy -O binary addi.out addi.bin
hexdump -v -e '"%08x\n"' addi.bin > addi.txt

Или просто запустить make, чтобы для каждого файла .s создать соответствующий .txt.

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /