共通 - 程序和二进制文件
目标程序说明
大家在有了实验 1 的基础之后,都应该能看懂在上一节中给出的目标程序的功能:
- 计算
1+2+3+...+100
的结果 - 将结果存入
0x80000100
处 - 在串口输出
done!
为什么要在代码中打 5 遍几乎相同的代码来输出'done!'?
如果使用类似于实验 1 中的方式,将写串口封装为函数,则会向程序中加入两条相对较难实现的指令jal
和jalr
。为了让实验 6 更加简单,我们选择不在实验 6 中要求大家实现这两条指令。
获得程序
在本实验中,程序需要预先装载至 SRAM 当中。为此,需要目标程序对应的二进制文件。
在提供的 rv-2024.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 文件中。
将上一节中的汇编放入该文件夹,保存为扩展名为 s
的汇编文件(如 sum.s
)。在 实验环境 中,进入该文件夹执行 make
指令,我们就获得了可用于实验的二进制文件了(使用 sum.s
会获得 sum.bin
)。
当你需要获得 elf 进行反汇编时,可以选择 make 对应的 elf(如 sum.elf
),在获得 elf 文件之后就可以进行反汇编和其他操作了。
最后更新:
2024年10月23日
作者: