如何使用尖峰打印寄存器的值?

How to print value of a register using spike?

我有一个 RISCV 机器的汇编代码。 我添加了一条指令来访问浮点控制和状态寄存器并将浮点标志存储在寄存器 a3 中。我想打印它的值以证明在发生浮点异常时设置了标志。

我试过用spike。 spike(在调试模式下)有一条指令打印寄存器的值:

: reg 0 a3

打印a3的值。 但首先我必须达到我想要的点。 我不知道我将如何达到这一点。

    .file   "learn_Assembly.c"
    .option nopic
    .text
    .comm   a,4,4
    .comm   b,4,4
    .align  1
    .globl  main
    .type   main, @function
main:
    addi    sp,sp,-32
    sd  s0,24(sp)
    addi    s0,sp,32
    lui a5,%hi(a)
    lui a4,%hi(.LC0)
    flw fa5,%lo(.LC0)(a4)
    fsw fa5,%lo(a)(a5)
    lui a5,%hi(b)
    lui a4,%hi(.LC1)
    flw fa5,%lo(.LC1)(a4)
    fsw fa5,%lo(b)(a5)
    lui a5,%hi(a)
    flw fa4,%lo(a)(a5)
    lui a5,%hi(b)
    flw fa5,%lo(b)(a5)
    fmul.s  fa5,fa4,fa5

    frflags a3

    fsw fa5,-20(s0)
    li  a5,0
    mv  a0,a5
    ld  s0,24(sp)
    addi    sp,sp,32
    jr  ra
    .size   main, .-main
    .section    .rodata
    .align  2
.LC0:
    .word   1082130432
    .align  2
.LC1:
    .word   1077936128
    .ident  "GCC: (GNU) 8.2.0"

另一种选择是使用汇编指令以某种方式编写打印它,我不确定该怎么做。

您可以使用 until spike 指令执行直到达到所需的相等性:

: until pc 0 2020                   (stop when pc=2020)

如解释 here(交互式调试)。

一旦达到该值,您可以使用 reg 读取您想要的值。

要了解您的程序流程,您可以从已编译的 elf 中创建程序的 对象转储

创建小精灵 :-

riscv64-unknown-elf-gcc assmebly_code.s -o executable.elf

然后您可以通过 :-

创建 对象转储
 riscv64-unknown-elf-objdump -d executable.elf > executable.dump

executable.dump 将包含这样的程序流程:-

executable.elf:     file format elf64-littleriscv


Disassembly of section .text:

00000000000100b0 <_start>:
   100b0:   00002197            auipc   gp,0x2
   100b4:   35018193            addi    gp,gp,848 # 12400 <__global_pointer$>



   100b8:   81818513            addi    a0,gp,-2024 # 11c18 <_edata>
   100bc:   85818613            addi    a2,gp,-1960 # 11c58 <_end>
   100c0:   8e09                    sub a2,a2,a0
   100c2:   4581                    li  a1,0
   100c4:   1e6000ef            jal ra,102aa <memset>
   100c8:   00000517            auipc   a0,0x0
   100cc:   13850513            addi    a0,a0,312 # 10200 <__libc_fini_array>
   100d0:   104000ef            jal ra,101d4 <atexit>
   100d4:   174000ef            jal ra,10248 <__libc_init_array>
   100d8:   4502                    lw  a0,0(sp)
   100da:   002c                    addi    a1,sp,8
   100dc:   4601                    li  a2,0
   100de:   0be000ef            jal ra,1019c <main>
   100e2:   0fe0006f            j   101e0 <exit>
   .......  ........            .................
   .......  ........            .................
   .......  ........            .................

识别所需的 pc 和所需的 a3 值。

然后在 spike 上使用命令 until 到 运行 直到那个 pc 值:

: until pc 0 <*required pc*>

注意:您的编译器和汇编器名称可能不同。