如何从 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
我尝试使用 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