Skip to content

Latest commit

 

History

History
84 lines (67 loc) · 1.9 KB

16.md

File metadata and controls

84 lines (67 loc) · 1.9 KB

调试

llvm-mc

首先我们使用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)

llvm-objdump

  • -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

qemu 反汇编

-d in_asm 生成反汇编

qemu 调试

-g 1234 qemu打开端口为1234,用于和gdb链接

gdb负责调试。

窗口一qemu:

qemu-riscv64 -g 1234 hello

窗口二gdb:

riscv64-unknown-elf-gdb hello

(gdb) target remote localhost:1234

汇编语言的语法