2016-08-03 44 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 PK的a.out

REG 0 A0

它總是返回爲0x0 0000000億。爲什麼?我究竟做錯了什麼?

+1

在'main'結尾沒有返回指令是否正常?不執行只是落入下一個功能? (如果你幸運的話,它可能會將a0清零並退出進程)。我不熟悉RISCV或您正在使用的模擬器,但我猜測'reg 0 a0'是模擬器的調試輸出,而前兩行是shell命令? –

回答

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

沒有參數的「運行」會運行並顯示所有的指令。 –