编程语言
首页 > 编程语言> > RISC-V汇编

RISC-V汇编

作者:互联网

ASM@RISC-V

CPU寄存器

Register ABI Discription Attribution
x0 zero 硬件常数0 N/A
x1 ra 返回地址 Caller
x2 sp 栈指针 Callee
x3 gp 全局指针 -
x4 tp 线程指针 -
x5-x7 t0-t2 临时变量 Caller
x8 s0/fp 保存寄存器/帧指针 Callee
x9 s1 保存寄存器 Callee
x10-x11 a0-a1 函数参数/返回值 Caller
x12-x17 a2-a7 函数参数 Caller
x18-x27 s2-s11 保存寄存器 Callee
x28-x31 t3-t6 临时变量 Caller
f0-f7 ft0-ft7 浮点临时变量 Caller
f8-f9 fs0-fs1 浮点保存寄存器 Callee
f10-f11 fa0-fa1 浮点函数参数/返回值 Caller
f12-f17 fa2-fa7 浮点函数参数 Caller
f18-f27 fs2-fs11 浮点保存寄存器 Callee
f28-f31 ft8-ft11 浮点临时变量 Caller

32位RISC-V(RV32)指令集概述

典型汇编语句

label: opcode operands comment
标签 操作码 操作数 注释

指令格式

RV32I基本指令集

算术指令

加载指令

条件分支指令

跳转控制指令

寄存器屏障指令

RV32标准拓展指令

RV32M标准拓展指令

RV32A标准拓展指令

RV32F标准拓展指令

伪指令

实际上是由基本指令组合而成

加载伪指令

算术伪指令

浮点算术伪指令

条件分支伪指令

跳转控制伪指令

启动

注释

以符号 # 或 ; 作为分隔号,当行分隔号以后的部分会被视作注释

代指

指目标寄存器,实际代码中可以是t0、t1等

代码格式(C语言嵌套汇编)

在C语言文件中嵌入汇编代码,除对固定地址寄存器并直接进行操作外,需要将变量等参数传入汇编程序中,才能保证操作有效,想要传入参数,需要通过操作符列表来完成

关键字

标记符号

输出操作符之间需使用逗号分割

操作符列表

用于告知编译器当前内联汇编语句可能会对某些寄存器或内存进行修改,使得编译器在优化时将其因素考虑进去

范例

int abc = 10,cba = 20;   
printf("%d & %d\n",abc,cba);

asm volatile(
    "mv %[da],%3\n"
    "add %2,%1,%0\n"
    "li %3,12\n"

    : [da]"=r"(abc), "=r"(cba)                 // Working
    : "r"(abc), [db]"r"(cba)                 // Working
    : "t1", "t2"//, "x7"
);

printf("%d & %d\n",abc,cba);

输出结果为:

10 20   (修改前)
40 12   (修改后)

标签:汇编,操作数,符号,Register,RISC,Immediate,指令,寄存器
来源: https://www.cnblogs.com/Ryzon/p/16351796.html