risc-v 汇编函数与C语言函数相互调用

硬件:risc-v 开发板
在这里插入图片描述

# --recursive  表示把子模块一起  clone
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
硬件:risc-v 开发板
软件环境:Linux X220 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu 
Nov 14 12:06:39 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
IDE:VSCode1.41.1 + platformio IDE+ gd32v

汇编文件:Add.S (注意是大写S)
注意:.S文件是需要编译器预处理的,.s文件是不进行预处理的(也可以简单的理解为.S编译生成对应的.s文件)
不然在VSCode里会编译错误:
riscv64-unknown-elf-as: unrecognized option ‘-x’

.file Add.S
.section .text
.globl Add
.type Add,@function ;可选
Add:
add a0,a0,a1                                         ;// a0对应参数1,a1对应参数2
ret                                                             ;且a0带返回值

上述的汇编为叶文件(不调其它函数的文件)汇编函数格式,如果需要调用其它函数需要按 图2-1
在c/c++文件里调用汇编语言编写的函数
//先声明函数原型

int Add(int i,int j);

int main(void)
{
    //...other codes
    int rtn=Add(100,200); // a0对应参数1,a1对应参数2,...a7对应参数8(这里寄存器为接口名称:ABI Name)
    printf("%d",rtn);
    //...other codes
    return 0;
}

汇编调用汇编函数 calculate(int x,int y,int z) #计算x-(y+z)
文件:Sub.S

.section .text
.globl Sub
Sub:
sub a0,a0,a1
ret

文件:calculate.S #;函数调用模板

.section .text         #";函数调用模板"
.equ framesize,16 #"frameszie=ra+a0+a1+...an总字符数"
.globl calculate #计算x-(y+z)
.type calculate,@function
calculate:
#";calculate(a0,a1,a2)//这里3个参数 framesize=(3+1)*4  #假定每个参数4个字节"
addi sp,sp,-framesize                              #";堆指针上浮增加堆空间"
sw ra,framesize-4(sp)
sw s0,framesize-8(sp)
sw  s1,framesize-12(sp)
sw  s2,framesize-16(sp)
mv s2,a0                                    #"Add 参数1 x"
mv s1,a1                                    #"Add 参数2 y"
mv s0,a2                                    #"Add 参数3 z"
#-----开始操作---------
add a1,s0,s1                            #(y+z)
mv a0,s2                                   # x
jal Sub                                       #x-(y+z)
#------结束操作--------
lw ra,framesize-4(sp)                                       ;"取回返回地址"
lw s0,framesize-8(sp)
lw s1,framesize-12(sp)
lw  s2,framesize-16(sp)
addi sp,sp,framesize                                       ;"返还堆空间"
ret

calculatePrint.S
汇编调用汇编Sub函数及c/c++函数printf(“%d-(%d+%d)=%d”,x,y,z,r)

.section .text
.equ framesize,16 #"frameszie=ra+a0+a2+...an总字符数"
.globl calculatePrint #"计算x-(y+z)"
.type calculatePrint,@function
calculatePrint:
#";calculate(a0,a1,a2)//这里3个参数 framesize=(3+1)*4  #假定每个参数4个字节"
#";printf('%d-(%d+%d)=%d',a0,a1,a2,a3);"
addi sp,sp,-framesize
sw ra,framesize-4(sp)
sw s0,framesize-8(sp)
sw  s1,framesize-12(sp)
sw  s2,framesize-16(sp)
mv s2,a0                                    #"Add 参数1 x"
mv s1,a1                                    #"Add 参数2 y"
mv s0,a2                                    #"Add 参数3 z"
#-----开始操作---------
add a1,s0,s1                            #(y+z)
mv a0,s2                                   # x
jal Sub                                       #x-(y+z)
#"printf('%d-(%d+%d)=%d',x,y,z,r)"
mv a4,a0                                #"返回值"
mv a3,s0                                #x
mv a2,s1                                #y
mv a1,s2                                #z
la  a0,format                       #"format"
jal printf
#------结束操作--------
lw ra,framesize-4(sp)
lw s0,framesize-8(sp)
lw s1,framesize-12(sp)
lw  s2,framesize-16(sp)
addi sp,sp,framesize
ret
.section  .rodata
format:
    .string "%d-(%d+%d)=%d"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值