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

时间:2019-06-28 11:31:54

标签: riscv

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

我尝试使用秒杀。尖峰(在调试模式下)有一条指令可以打印寄存器的值:

: 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"

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

2 个答案:

答案 0 :(得分:2)

您可以使用直到峰值指令执行直到达到所需的相等性为止:

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

如说明here(交互式调试)。

一旦达到值,您就可以使用reg读取所需的值。

答案 1 :(得分:2)

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

要创建 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>
   .......  ........            .................
   .......  ........            .................
   .......  ........            .................

使用必需的 a3 值识别必需的 pc

然后在尖峰时使用命令直到运行直到该pc值:

: until pc 0 <*required pc*>

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