在RISC-V

时间:2018-09-24 12:12:57

标签: assembly riscv illegal-instruction

早上好,

我试图为RISC-V体系结构编写一个简单的程序,其中有一个简单的main(_start),它执行不执行任何操作的函数调用并返回到调用者。

我编写的代码如下:

.section .text
.global _start

test:
    lw a1, 0(sp)



    # ritorna al chiamante
    jr ra

_start:
    # push sullo stack
    addi sp, sp, -4

    li a1, 5

    # mette valore di ritorno sullo stack
    # salva a1 sullo stack
    sw a1, 0(sp)

    # chiamata a funzione
    jal ra, test

    # pop dallo stack
    addi sp, sp, +4

    li a6, 2

为执行该程序,我运行:

$ riscv64-unknown-elf-as somma.s -o somma.o
$ riscv64-unknown-elf-ld somma.o -o somma.elf
$ spike pk somma.elf

作为输出,我得到:

z  0000000000000000 ra 0000000000010090 sp 000000007f7e9b50 gp 0000000000000000
tp 0000000000000000 t0 0000000000000000 t1 0000000000000000 t2 0000000000000000
s0 0000000000000000 s1 0000000000000000 a0 0000000000000000 a1 0000000000000005
a2 0000000000000000 a3 0000000000000000 a4 0000000000000000 a5 0000000000000000
a6 0000000000000002 a7 0000000000000000 s2 0000000000000000 s3 0000000000000000
s4 0000000000000000 s5 0000000000000000 s6 0000000000000000 s7 0000000000000000
s8 0000000000000000 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000
t3 0000000000000000 t4 0000000000000000 t5 0000000000000000 t6 0000000000000000
pc 0000000000010098 va 0000000000000000 insn       00000000 sr 8000000200046020
An illegal instruction was executed!

在这种情况下,我们在a6寄存器中有2,因此我认为由于正确执行了最后一条指令,因此程序的控制已正确返回给调用方,但是无论如何我都会收到错误消息“执行了一条非法指令!” 您能给我一些解决这个问题的提示吗?

谢谢

1 个答案:

答案 0 :(得分:1)

这是C语言与汇编编程之间的区别之一:在C语言中,编译器为您处理函数的进入/退出代码,而在汇编语言中,则是您自己处理。在这种特定情况下,您的_start函数不会以ret结尾,因此执行将持续到该函数末尾。由于那是二进制文件的结尾,因此下一个字节可能是非法指令(在RISC-V中,全0指令是非法的)。

_start函数有点特殊:虽然大多数RISC-V ABI都说可以从_start返回,但是规范的_start永远不会返回,而是调用直接exit()。对于_start来说,最好的选择是让它以li a0, 0; call exit; ret结尾。