2016-08-03 5 views
0

Я хочу написать простую программу RISCV в сборке, а затем проверить ее. Программа должна просто загрузить значение в регистр и добавить значение к нему:RISCV и Spike: добавьте что-нибудь и прочитайте значение

.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 неизвестный эльф-GCC hello.s

spke -d рк a.out

рег 0 a0

Он всегда возвращает 0x0 000000000000000. Зачем? Что я делаю не так?

+1

Нормально ли, что нет инструкции возврата в конце 'main'? Не выполняется ли выполнение только следующей функции? (что может привести к нулю а0 и выйти из процесса, если вам повезет). Я не знаком с RISCV или симулятором, который вы используете, но я предполагаю, что 'reg 0 a0' является отладочным выходом из симулятора, а предыдущие две строки - командами оболочки? –

ответ

2

Когда вы начинаете всплеск с -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 

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

+0

Большое вам спасибо за этот ответ. Это очень помогло мне. Кроме того, я узнал, что можно напечатать, например. «запустить 10» и будет выполнено 10 команд - есть ли какая-либо команда для выполнения всей программы? –

+0

«run» без аргументов будет запускаться и отображать все инструкции. –

Смежные вопросы