2016-08-03 41 views
0

Ich möchte ein einfaches RISCV-Programm in Assembly schreiben und dann testen. Das Programm sollte einfach einen Wert in ein Register geladen werden und einen Wert addieren:RISCV und Spike: Etwas hinzufügen und Wert lesen

.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. 

Allerdings, wenn ich gebe:

riscv64-unknown-elf-gcc hello.s

SPKE- -d pk a.out

reg 0 a0

Es gibt immer 0x0 000000000000000. Warum? Was mache ich falsch?

+1

Ist es normal, dass es am Ende von 'main' keine Rückkehranweisung gibt? Fällt die Ausführung nicht einfach in die nächste Funktion? (was könnte a0 Null und verlassen Sie den Prozess, wenn Sie Glück haben). Ich bin nicht vertraut mit RISCV oder dem Simulator, den Sie verwenden, aber ich vermute, dass "reg 0 a0" Debug-Ausgabe vom Simulator ist, und die vorherigen zwei Zeilen sind Shell-Befehle? –

Antwort

2

Wenn Sie spike mit -d starten, wird die Eingabeaufforderung gedruckt, bevor Anweisungen ausgeführt werden.

Zerlegen Sie Ihr kompiliertes Programm, um alle Anweisungen zu sehen, die um Ihre Unterroutine main() mit zwei Befehlen gewickelt sind.

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 

I Spike auf den ersten Befehl von Haupt laufen gesagt, dann einzelne trat, und dann angezeigt Register 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 

Als Kommentator Peter weist darauf hin, eine Prozedur gibt in der Regel am Ende. Im Fall von main, fällt es durch zu atexit(), etc.

Sie können den Befehl "r" verwenden, um die vollständige Ausführungsverfolgung von "pk Hallo" zu sehen.

+0

Vielen Dank für diese Antwort. Das hat mir sehr geholfen. Ich fand auch heraus, dass es möglich ist, z.B. "run 10" und 10 Befehle werden ausgeführt - gibt es einen Befehl, um das ganze Programm auszuführen? –

+0

"run" ohne Argumente wird ausgeführt und alle Anweisungen angezeigt. –