【问题标题】:RISCV and Spike: Add something and read valueRISCV 和 Spike:添加一些东西并读取价值
【发布时间】:2016-12-09 15:56:10
【问题描述】:

我想在汇编中编写一个简单的 RISCV 程序,然后对其进行测试。程序应该简单地将一个值加载到一个寄存器中并为其添加一个值:

    .file   "hello.c"
.text
.align  2
.globl  main
.type   main, @function
main:
   li  a0, 2
   add a0, a0, 7

  .size main, .-main
  .ident    "GCC: (GNU) 5.3.

但是,当我输入时:

riscv64-unknown-elf-gcc hello.s

spke -d pk a.out

注册 0 a0

它总是返回 0x0000000000000000。为什么?我做错了什么?

【问题讨论】:

  • main末尾没有return指令正常吗?执行不只是落入下一个功能吗? (如果幸运的话,它可能会将 a0 归零并退出该过程)。我不熟悉RISCV或者你使用的模拟器,但我猜reg 0 a0是模拟器的调试输出,前两行是shell命令?

标签: gcc assembly add riscv spike


【解决方案1】:

当您使用 -d 启动spike时,会在执行任何指令之前打印命令提示符。

反汇编你的编译程序,查看包含在你的两条指令 main() 子例程中的所有指令。

riscv64-unknown-elf-objdump -d hello | less
Disassembly of section .text:

0000000000010000 <_ftext>:
   10000:       00002197                auipc   gp,0x2

...
0000000000010164 <main>:
   10164:       00200513                li      a0,2
   10168:       00750513                addi    a0,a0,7

我让spike跑到main的第一条指令,然后单步执行,然后显示寄存器a0:

$ spike -d pk foo

Note: Hitting enter is the same as: run 1
: until pc 0 0x0000000000010164
: pc 0
0x0000000000010164
: run 1
core   0: 0x0000000000010164 (0x00200513) li      a0, 2
: reg 0 a0
0x0000000000000002
: run 1
core   0: 0x0000000000010168 (0x00750513) addi    a0, a0, 7
: reg 0 a0
0x0000000000000009

正如评论者 Peter 所指出的,一个过程通常在最后返回。在 main 的情况下,它通过 atexit() 等。

可以使用“r”命令查看“pk hello”的完整执行轨迹。

【讨论】:

  • 非常感谢您的回答。这对我帮助很大。另外,我发现可以输入例如"run 10" 和 10 个命令将被执行 - 是否有任何命令可以执行整个程序?
  • "run" 不带参数将运行并显示所有指令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2012-08-11
  • 1970-01-01
  • 2014-05-02
  • 2021-09-02
  • 2016-12-24
相关资源
最近更新 更多