【问题标题】:Illegal instruction when executing function call on RISC-V在 RISC-V 上执行函数调用时出现非法指令
【发布时间】:2018-09-24 12:12:57
【问题描述】:

早安,

我正在尝试为 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,所以我假设程序的控制权正确地返回给调用者,因为最后一条指令被正确执行,但无论如何我得到错误“执行了非法指令!” 你能给我一些解决这个问题的提示吗?

谢谢

【问题讨论】:

标签: assembly riscv illegal-instruction


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多