蘭雅sRGB 个人笔记 https://262235.xyz
提供编程和电脑应用视频教程,工具和源代码
C, C++, Python Programming, Source Code, Video

旧Hexo博客 | Github | IP定位WebAPI | Docker Hub
编程中文文档 | 网盘分享 | 中文Linux命令

RARS_RISC-V汇编器和运行时模拟器,编写Hello World源码

RiscV.RARS.webp

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 
本原创文章自由转载,转载请注明本博来源及网址 | 当前页面:兰雅sRGB个人笔记 » RARS_RISC-V汇编器和运行时模拟器,编写Hello World源码