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