RARS,即 RISC-V 汇编程序、模拟器和运行时,将汇编和模拟 RISC-V 汇编语言程序的执行。 它的主要目标是为开始使用 RISC-V 的人们提供一个有效的开发环境。
B站视频 RARS RISC-V 汇编器和运行时模拟器, 编写Hello World源码
创建 Hello World
我们不用访问 C 标准库,所以jiu调用 write(fd,buffer,len) 直接映射到 Linux 系统调用。 并且让我们将字符串的定义提升到一个全局变量中,因为汇编语言不允许字符串作为参数。
这给我们留下了一些可直接翻译的 C 代码:
char* str = "Hello World!\n";
int main(){
write(1,str,13);
}
第一行可以翻译成 RISC-V
汇编:
.data
str: .string "Hello World!\n"
C语言 main
函数 和 系统调用 write
函数,可以翻译成 RISC-V
汇编语句
.text
main:
li a0, 1
la a1, str
li a2, 13
li a7, 64
ecall
加上注释和 exit
系统调用,完成完整的 RISC-V
汇编源码
.data # Tell the assembler we are defining data not code
# 告诉汇编器我们定义的是数据而不是代码
str: # Label this position in memory so it can be referred to in our code
# 在内存中标记这个位置,以便我们的代码中引用它
.string "Hello World!\n" # Copy the string "Hello World!\n" into memory
# 将字符串 "Hello World!\n" 复制到内存中
.text # Tell the assembler that we are writing code (text) now
# 告诉汇编程序我们现在正在编写代码(文本)
main: # Make a label to say where our program should start from
# 做一个标签来说明我们的程序应该从哪里开始
li a0, 1 # li means to Load Immediate and we want to load the value 1 into register a0
# li 表示立即加载,我们要将值 1 加载到寄存器 a0
la a1, str # la is similar to li, but works for loading addresses
# la 类似于 li,但用于加载地址
li a2, 13 # like the first line, but with 13. This is the final argument to the system call
# 与第一行相似,但带有 13。这是系统调用的最后一个参数
li a7, 64 # a7 is what determines which system call we are calling and we what to call write (64)
# a7 决定了我们正在调用哪个系统调用以及我们调用什么 write (64)
ecall # actually issue the call
# 实际发出syscall
li a0, 0 # The exit code we will be returning is 0
# 我们将返回的退出代码是 0
li a7, 93 # Again we need to indicate what system call we are making and this time we are calling exit(93)
# 我们需要再次指出我们正在进行的系统调用,这次我们调用 exit(93)
ecall