我有一个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"
另一种选择是使用我不确定该怎么做的汇编指令以某种方式写出它。
答案 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*>
注意 :您的编译器和汇编器名称可能会有所不同。