【问题标题】:How to print value of a register using spike?如何使用尖峰打印寄存器的值?
【发布时间】:2019-06-28 11:31:54
【问题描述】:

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

我尝试使用尖峰。在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"

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

【问题讨论】:

    标签: riscv


    【解决方案1】:

    要了解程序的流程,您可以从已编译的 elf 中创建程序的 object dump

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

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

    : until pc 0 <*required pc*>
    

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

    【讨论】:

      【解决方案2】:

      您可以使用直到尖峰指令执行直到达到所需的相等:

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

      解释here(交互式调试)。

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

      【讨论】:

      • 但是如何知道在我想要的位置的 pc 中有什么值。
      • 换句话说,我怎样才能到达那里?
      猜你喜欢
      • 2015-10-11
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多