Step1: build with busybox.
Signed-off-by: Chen Wang <wangchen20@iscas.ac.cn>
This commit is contained in:
79
package/opensbi/hello.s
Normal file
79
package/opensbi/hello.s
Normal file
@@ -0,0 +1,79 @@
|
||||
# hello.s - RISC-V 64 位裸机程序, 打印 "hello world!" 到控制台
|
||||
|
||||
.section .text
|
||||
.global _start
|
||||
_start:
|
||||
# 0x80000000 <- OpenSBI
|
||||
# 0x80200000 <- hello.bin
|
||||
# 0x80210000 <- 栈顶
|
||||
|
||||
# 设置栈指针
|
||||
li sp, 0x80210000
|
||||
|
||||
# 调用打印函数
|
||||
call print_hello
|
||||
|
||||
# 无限循环(退出 qemu 需要按 Ctrl+A X)
|
||||
1: j 1b
|
||||
|
||||
# 打印 "hello world!" 函数
|
||||
print_hello:
|
||||
# 保存返回地址
|
||||
addi sp, sp, -8
|
||||
sd ra, 0(sp)
|
||||
|
||||
# 加载字符串地址
|
||||
la a0, hello_string
|
||||
|
||||
# 调用字符串打印函数
|
||||
call puts
|
||||
|
||||
# 恢复返回地址
|
||||
ld ra, 0(sp)
|
||||
addi sp, sp, 8
|
||||
ret
|
||||
|
||||
# 字符串打印函数 void puts(char *str)
|
||||
# a0: 字符串地址
|
||||
puts:
|
||||
# 保存寄存器
|
||||
addi sp, sp, -16
|
||||
sd ra, 8(sp)
|
||||
sd s0, 0(sp)
|
||||
|
||||
mv s0, a0 # 保存字符串地址
|
||||
|
||||
PRINT_LOOP:
|
||||
# 读取一个字符
|
||||
lb a0, 0(s0)
|
||||
beq a0, zero, PRINT_DONE # 直到遇到 '\0' 结束
|
||||
|
||||
# 调用字符打印函数
|
||||
call putc
|
||||
|
||||
# 下一个字符
|
||||
addi s0, s0, 1
|
||||
j PRINT_LOOP
|
||||
|
||||
PRINT_DONE:
|
||||
# 恢复寄存器
|
||||
ld s0, 0(sp)
|
||||
ld ra, 8(sp)
|
||||
addi sp, sp, 16
|
||||
ret
|
||||
|
||||
# 字符打印函数 void putc(char c)
|
||||
# a0: 要打印的字符
|
||||
putc:
|
||||
# 使用 SBI 调用 (console_putchar)
|
||||
li a7, 0x01 # SBI_EXT_0_1_CONSOLE_PUTCHAR
|
||||
ecall
|
||||
ret
|
||||
|
||||
# 数据段
|
||||
.section .rodata
|
||||
hello_string:
|
||||
.asciz "\nHello RISC-V world!\n"
|
||||
|
||||
# 对齐到4字节边界
|
||||
.align 2
|
||||
Reference in New Issue
Block a user