首先我们使用llvm-mc
可以方便的对单条指令或代码段进行汇编与反汇编。
echo "vle8.v v0, (a0)" | $RISCV/llvm/bin/llvm-mc -triple=riscv64 --mattr=+experimental-v --show-encoding
结果(注意此处的编码是小端序的,转换为二进制时,即31~0的顺序排列的话,应为0x02 0x05 0x00 0x07):
.text
vle8.v v0, (a0) # encoding: [0x07,0x00,0x05,0x02]
echo "0x07,0x00,0x05,0x02" | $RISCV/llvm/bin/llvm-mc -triple=riscv64 --mattr=+experimental-v --disassemble
结果
.text
vle8.v v0, (a0)
- -d 代码段反汇编
- -S 显示源代码(编译时加上-g)
- -l 显示行号
此处使用前文的hello.c文件,mattr选项在此未生效,仅作演示。
llvm-objdump hello -Sd --mattr=+experimental-v
节选的部分段落
0000000000010188 <main>:
; int main(){
10188: 01 11 addi sp, sp, -32
1018a: 06 ec sd ra, 24(sp)
1018c: 22 e8 sd s0, 16(sp)
1018e: 00 10 addi s0, sp, 32
10190: 01 45 mv a0, zero
10192: 23 30 a4 fe sd a0, -32(s0)
10196: 23 26 a4 fe sw a0, -20(s0)
; printf("hello world!\n");
1019a: 71 65 lui a0, 28
1019c: 13 05 05 45 addi a0, a0, 1104
101a0: ef 00 40 16 jal 0x10304 <printf>
; return 0;
101a4: 03 35 04 fe ld a0, -32(s0)
101a8: 42 64 ld s0, 16(sp)
101aa: e2 60 ld ra, 24(sp)
101ac: 05 61 addi sp, sp, 32
101ae: 82 80 ret
-d in_asm 生成反汇编
-g 1234 qemu打开端口为1234,用于和gdb链接
gdb负责调试。
窗口一qemu:
qemu-riscv64 -g 1234 hello
窗口二gdb:
riscv64-unknown-elf-gdb hello
(gdb) target remote localhost:1234
→ 汇编语言的语法