RISCV и Spike: добавьте что-нибудь и прочитайте ценность

Я хочу написать простую программу на 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 а0

Он всегда возвращает 0x0000000000000000. Зачем? Что я делаю неправильно?

1 ответ

Решение

Когда вы запускаете spike с помощью -d, командная строка выводится перед выполнением любых инструкций.

Разберите свою скомпилированную программу, чтобы увидеть все инструкции, обернутые вокруг вашей подпрограммы 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

Как отмечает комментатор Питер, процедура обычно возвращается в конце. В случае с main, он падает на atexit() и т. Д.

Вы можете использовать команду "r", чтобы увидеть полный след выполнения команды "pk hello".

Другие вопросы по тегам