首页 > 解决方案 > 如何从 RISC V 程序集打印到 Linux 中的控制台

问题描述

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

模拟器是 TinyEmu,busybox 有所有的实用程序。 小鸸鹋

镜像是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 和/或 gcc 命令将获得一个可执行文件,该可执行文件可以正确调用 syscall 以打印到控制台?

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

标签: linuxgccassemblyriscv

解决方案


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

这是固定线路:

li a0, 1  # stdout

推荐阅读