如何使用尖峰打印寄存器的值?
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*>
注意:您的编译器和汇编器名称可能不同。
我有一个 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*>
注意:您的编译器和汇编器名称可能不同。