571
社区成员
发帖
与我相关
我的任务
分享apt install gcc-riscv64-linux-gnu
vi test.c
#include<stdio.h>
int func(int a){
return a+14;
}
int main()
{
int a = 12;
printf("ans=%d",func(a));
return 0;
}
riscv64-linux-gnu-gcc -S -o test.s test.c
.file "test.c"
.option pic
.text
.align 1
.globl func
.type func, @function
func:
addi sp,sp,-32 #sp为栈顶指针,sp-32,为函数分配空间
sd s0,24(sp) #s0为栈底指针,存储s0的值
addi s0,sp,32 #s0=sp+32,将s0指向栈底
mv a5,a0 #这两句保存a5的值
sw a5,-20(s0)
lw a5,-20(s0) #将s0-20中的值存放到a5中
addiw a5,a5,14 #a5=a5+14
sext.w a5,a5 #sign-extend(符号拓展)
mv a0,a5 #a0为函数返回值
ld s0,24(sp) #恢复s0的值
addi sp,sp,32 #恢复sp的值
jr ra #无条件跳转到返回地址
.size func, .-func
.section .rodata
.align 3
.LC0:
.string "ans=%d" #将字符串"ans=%d"放入内存
.text
.align 1
.globl main #声明main为全局符号
.type main, @function
main:
addi sp,sp,-32 #sp为栈顶指针,sp-32,为函数分配空间
sd ra,24(sp) #ra存储返回地址,存储ra的值
sd s0,16(sp) #s0为栈底指针,存储s0的值
addi s0,sp,32 #s0=sp+32,将s0指向栈底
li a5,12 #a5存储int型变量a,赋初值12
sw a5,-20(s0) #这两句保存a5的值
lw a5,-20(s0)
mv a0,a5 #将a5作为调用函数的参数
call func #调用函数func
mv a5,a0 #a0为函数func的返回值,存入a5
mv a1,a5
lla a0,.LC0 #加载.LC0的内容
call printf@plt #调用printf函数
li a5,0 #main函数返回值为0,先让a5储存0
mv a0,a5 #然后将a5的值存在a0,作为main函数的返回值
ld ra,24(sp) #恢复ra的值
ld s0,16(sp) #恢复s0的值
addi sp,sp,32 #恢复sp的值
jr ra #无条件跳转到返回地址
.size main, .-main
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits
作者:269