开篇
riscv编译器安装参考:在Ubuntu上搭建RiscV交叉编译环境_ubuntu下交叉编译riscv程序的ide环境-CSDN博客
示例:
$ riscv64-unknown-linux-gnu-gcc -static -o hello.o hello.c
$ qemu-riscv64 hello.o
hello world!
简介
汇编语言是一种“低级”语言。
汇编语言的缺点:
-难度
-难写
-难移植
汇编语言的优点:
-灵活
-强大
汇编语言的应用场景
-需要直接访问底层硬件的地方
-需要对性能执行极致优化的地方
汇编语言语法介绍(GNU版本)
基本组成
汇编文件一般后缀为.S或.s,.S包含了预处理的语句,.s就是纯粹的汇编语句。
一个完整的RISC-V汇编程序有多条语句(statement)组成。一条典型的RISC-V汇编语言由3部分组成:
[label:] [operation] [comment]
打方括号表示可选。
-label表示一个标号,必须以":"结尾。label相当于一个地址,给这个地址起了个名字。是这条指令存放在内存的地址。
-operation可以由以下多种类型:
-instruction(指令):直接对应二进制机器指令的字符串
-preudo-instruction(伪指令):为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令(instruction)。(要在汇编器的手册里查看定义)
-directive(指示/伪操作):通过类似指令的形式(以“.”开头),通知汇编器如何控制代码的产生等,不对应具体的指令。属于汇编器自己定义的一些语法。(要在汇编器的手册里查看定义)
-macro:采用.macro/.endm自定义的宏
例子:
.macro do_nothing #directive
nop #preudo-instruction
nop #preudo-instruction
.endm
.text #directive 告诉大家生成的指令要放到text的section中
.global _start #directive _start是个全局变量,外部可见,有点像extern
_start: #label
li x6, 5 #preudo-instruction
li x7, 4 #preudo-instruction
add x5, x6, x7 #instruction
do_nothing #calling macro
.end #End of file
RISC-V汇编指令操作对象
寄存器:
-32个通用寄存器,x0~x31;
-在RISC-V中,Hart在执行算术逻辑运算时所操作的数据必须直接来自寄存器。
内存:
-Hart可以执行在寄存器和内存之间的数据读写操作;
-读写操作使用字节(Byte)为基本单位进行寻址;