571
社区成员
发帖
与我相关
我的任务
分享实验要求:
将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。
int add(int a,int b){
return a+b;
}
int main(){
int c=add(3,5);
return 0;
}
.file "1.c"
.option nopic
.text
.align 1
.globl add
.type add, @function
add:
add sp,sp,-32 //sp=sp-32 开辟32Byte栈空间
sd s0,24(sp) //*(sp+24)=s0 在(sp+24)存入s0
add s0,sp,32 //s0=sp+32
mv a5,a0 //a5=a0
mv a4,a1 //a4=a1
sw a5,-20(s0) //*(s0-20)=a5
mv a5,a4 //a5=a4
sw a5,-24(s0) //*(s0-24)=a5
lw a4,-20(s0) //a4=*(s0-24)
lw a5,-24(s0) //a5=*(s0-24)
addw a5,a4,a5 //a5=a4+a5
sext.w a5,a5 //符号扩展
mv a0,a5 //a0=a5
ld s0,24(sp) //s0=*(sp+24)
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
sd ra,24(sp) //*(sp+24)=ra
sd s0,16(sp) //*(sp+24)=s0
add s0,sp,32 //s0=sp+32
li a1,5 //a1=5
li a0,3 //a0=3
call add //调用函数add
mv a5,a0 //a5=a0
sw a5,-20(s0) //*(s0-20)=a5
li a5,0 //a5=0
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"