跳转至

共通 - 程序和二进制文件

目标程序说明

大家在有了实验 1 的基础之后,都应该能看懂在上一节中给出的目标程序的功能:

  1. 计算1+2+3+...+100的结果
  2. 将结果存入0x80000100
  3. 在串口输出done!

为什么要在代码中打 5 遍几乎相同的代码来输出'done!'?

如果使用类似于实验 1 中的方式,将写串口封装为函数,则会向程序中加入两条相对较难实现的指令jaljalr。为了让实验 6 更加简单,我们选择不在实验 6 中要求大家实现这两条指令。

获得程序

在本实验中,程序需要预先装载至 SRAM 当中。为此,需要目标程序对应的二进制文件。

在提供的 rv-2023.zip 中(简介#代码示例),有 asmcode 这个文件夹。在这个文件夹中提供了两份样例汇编以及一个 makefile 文件用于生成之后需要用到的二进制文件。

其中 makefile 文件如下:

BUILD_DIR = .
ARM_SOURCES = $(wildcard *.s)
TARGETS = $(addprefix $(BUILD_DIR)/,$(notdir $(ARM_SOURCES:.s=.bin)))
all: $(TARGETS)
%.elf: %.s
    riscv64-unknown-elf-gcc $< -march=rv32i -mabi=ilp32 -static -fno-pic -fno-builtin -nostdlib  -nostdinc -g -o $@ -Wl,-Ttext,0x0
%.bin: %.elf
    riscv64-unknown-elf-objcopy -j .text -O binary -S $< $@

可以看到,这个 makefile 默认对文件夹下的每一个.s 文件都会生成对应的.bin 文件。

关于生成 elf 这条命令中的参数,在RISC-V 汇编语言程序的调试一节中已经做了详细说明,在此不多赘述。

在生成 elf 之后,通过工具链中的 objcopy 工具,将 elf 文件中的.text 段提取了出来,并以二进制的方式写入到了.bin 文件中。

将上一节中的汇编放入该文件夹,在实验环境中,进入该文件夹执行make指令,我们就获得了可用于实验的二进制文件了。


最后更新: 2023年9月11日
作者:Jiajie Chen (95.0%), cuibst (2.5%), bosscharlie (2.5%)