linux - 如何从 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 资源,但我没有测试它们是否与系统调用表匹配)。
解决方案
输出设置为 stdout 的行将变为 0 而不是 1。
这是固定线路:
li a0, 1 # stdout
推荐阅读
- java - 测试我的语法程序时出错
- python - MultiIndex 与其值之一的布尔比较
- python - 写入下一个空列
- reactjs - 被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头
- python - 从json数组python中删除冗余键值
- entity-framework - EF Core - 如何根据外键从子表中选择计数
- java - 错误:无法访问 jarfile (Kubernetes)
- sql-server - 有没有办法在 SSAS 上对维度进行分区
- ldap - LDAP 未经身份验证的绑定(DN 没有密码)不允许
- c# - 屏幕共享错误 - 当文件已存在时无法创建文件