我正在设计自己的 RISC-V CPU,并且已经能够实现一些指令代码。
我已经安装了 GCC 编译器的 RV32I 版本,所以我现在可以使用汇编器了riscv32-unknown-elf-as
。
我试图用一条指令组装一个程序:
# simple.asm
add x5,x6,x7
我用汇编器编译它,然后用这个命令运行 objdump:
riscv32-unknown-elf-as simple.asm -o simple
riscv32-unknown-elf-objdump -D simple
这将打印出以下内容:
new: file format elf32-littleriscv
Disassembly of section .text:
00000000 <.text>:
0: 007302b3 add t0,t1,t2
Disassembly of section .riscv.attributes:
00000000 <.riscv.attributes>:
0: 2d41 jal 0x690
2: 0000 unimp
4: 7200 flw fs0,32(a2)
6: 7369 lui t1,0xffffa
8: 01007663 bgeu zero,a6,0x14
c: 00000023 sb zero,0(zero) # 0x0
10: 7205 lui tp,0xfffe1
12: 3376 fld ft6,376(sp)
14: 6932 flw fs2,12(sp)
16: 7032 flw ft0,44(sp)
18: 5f30 lw a2,120(a4)
1a: 326d jal 0xfffff9c4
1c: 3070 fld fa2,224(s0)
1e: 615f 7032 5f30 0x5f307032615f
24: 3266 fld ft4,120(sp)
26: 3070 fld fa2,224(s0)
28: 645f 7032 0030 0x307032645f
我的问题是:
- 这里发生了什么?我以为我会有一个简单的单行十六进制,但还有很多事情要做。
- 如何指示我的处理器开始读取某个内存地址的指令?看起来 objdump 也不知道指令将从哪里开始。
需要明确的是,此时我将处理器视为裸机。我想象我将在处理器中硬编码指令从内存地址 X 开始,数据在内存地址 Y 可用,堆栈在内存地址 Z 可用。这是正确的吗?或者这是错误的方法?