566
社区成员
发帖
与我相关
我的任务
分享
1.安装risc -v
sudo apt install gcc-riscv64-linux-gnu
2.编写c语言代码
#include<stdio.h>
int add(int a,int b){
return a+b;
}
int main(){
int ans = add(3,4);
return ans;
}
3.编译为汇编代码
//编译器将C源代码包括头文件stdio.h进行链接,得到test.i
riscv-none-embed-gcc -E test.c -o test.i
//Gcc把test.i代码翻译成汇编语言,输出为test.s
riscv-none-embed-gcc -S test.i -o test.s
4.代码分析
.file "test.c"
.option nopic
.text
.align 1
.globl add
.type add, @function
add:
add sp,sp,-32 //修改栈顶指针sp=sp-32,构造add函数的栈空间框架
sd s0,24(sp) //将s0的值存在sp+24位置中,s0是栈底指针
add s0,sp,32 //s0=sp+32
mv a5,a0 //将a0的值存入a5
mv a4,a1 //将a1的值存入a4
sw a5,-20(s0) //将a5的值存入s0-20
mv a5,a4 //将a4的值存入a5
sw a5,-24(s0) //将a5的值存入s0-24
lw a4,-20(s0) //将s0-20的值存入a4
lw a5,-24(s0) //将s0-24的值存入a5
addw a5,a4,a5 //将a4的值和a5相加,存入a5
sext.w a5,a5 //把a5的值存入内存
mv a0,a5 //把a5的值存入a0
ld s0,24(sp) //将sp+24的值放入s0
add sp,sp,32 //将sp=sp+32,销毁栈空间
jr ra //无条件跳转
.size add, .-add
.align 1
.globl main
.type main, @function
main:
add sp,sp,-32 //修改栈顶指针sp=sp-32,构造add函数的栈空间框架
sd ra,24(sp) //将返回地址ra存入sp+24
sd s0,16(sp) //将s0存入sp+16
add s0,sp,32 //s0=sp+32
li a1,4 //a1=4
li a0,3 //a0=3
call add //调用add函数
mv a5,a0 //a5=a0
sw a5,-20(s0) //s0-20=a5
lw a5,-20(s0) //a5=s0-20,相当于a5保存起来了
mv a0,a5 //a0=a5
ld ra,24(sp) //ra=sp+24
ld s0,16(sp) //s0=sp+16
add sp,sp,32 //将sp=sp+32,销毁栈空间
jr ra //无条件跳转
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
224