如何从 RISC V 程序集打印到 Linux 中的控制台

How to print to console in Linux from RISC V assembly

我尝试使用 as 和 gcc 在 Linux 中编译 RISC V 程序集。

模拟器是 TinyEmu,busybox 拥有所有实用程序。 TinyEmu

镜像为diskimage-linux-riscv-2018-09-23.

我可以让程序编译,但控制台上没有打印任何内容。

.section .text
.globl _start
_start:

    li a0, 0                    # stdout
1:  auipc a1, %pcrel_hi(msg)    # load msg(hi)
    addi a1, a1, %pcrel_lo(1b)  # load msg(lo)
    li a2, 12                   # length
    li a3, 0
    li a7, 64                   # _NR_sys_write
    ecall                       # system call

    li a0, 0
    li a1, 0
    li a2, 0
    li a3, 0
    li a7, 93                   # _NR_sys_exit
    ecall                       # system call

loop:
    j loop

.section .rodata
msg:   
    .string "Hello World\n"

我尝试了几种 as 和 gcc 调用的组合,但最近的是:

as -o hello.o hello.s
ld as -o hello.o hello.s

这会创建一个二进制文件,但没有控制台输出。

那么,ld and/or gcc 命令将获得一个 executable,它可以正确调用系统调用以打印到控制台?

此外,RISC V 上 Linux 中系统调用的参考在哪里? (我找到了 x86 资源,但我没有测试它们是否与系统调用 table 匹配)。

输出设置为 stdout 的行将变为 0 而不是 1。

这里是固定线路:

li a0, 1  # stdout