571
社区成员
发帖
与我相关
我的任务
分享实验要求
将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。
1.编写C语言代码
int square(int num){
return num*num;
}
int main(){
return square(3)+4;
}
2.生成的汇编代码及其注释如下:
.file "lab1.c"
.option pic
.text
.align 1
.globl square
.type square, @function
square: //square函数入口
addi sp,sp,-32 //修改栈指针sp=sp-32,push
sd s0,24(sp) //将s0寄存器的值存储到sp+24的位置上
addi s0,sp,32 //将sp+32的值存入s0
mv a5,a0 //将a0存放的参数存入a5
sw a5,-20(s0) //将a5中的值保存到s0-20的位置上
lw a5,-20(s0) //将s0-20的值写入a5
mulw a5,a5,a5 //将a5的值与a5的值相乘,结果写入a5
sext.w a5,a5 //将寄存器a5中的3位有符号整数进行符号扩展,扩展为64位有符号整数,结果存放在寄存器a5中
mv a0,a5 //将a5存放的参数存入a0
ld s0,24(sp) //将地址为sp+24的数据从内存中加载到寄存器s0中
addi sp,sp,32 //将sp+32的数据存入sp
jr ra //程序跳转指令
.size square, .-square
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16 //修改栈指针sp=sp-16,push
sd ra,8(sp) //ra是返回地址寄存器,将ra寄存器的值存储到sp+8的位置上
sd s0,0(sp) //s0是保存寄存器,用来保存函数调用前后不变的值,可以保存 栈底将s0寄存器的值存储到sp的位置上
addi s0,sp,16 //将sp+16的值存入s0
li a0,3 //将立即数3加载到寄存器a0中
call square //调用square函数
mv a5,a0 //将a0存放的参数存入a5
addiw a5,a5,4 //将a5中的值加上4存入a5中
sext.w a5,a5 //将寄存器a5中的3位有符号整数进行符号扩展,扩展为64位有符号整数,结果存放在寄存器a5中
mv a0,a5 //将a5存放的参数存入a0
ld ra,8(sp) //将sp+8位置的数据取出并存入ra中
ld s0,0(sp) //将sp指向的值存入s0中
addi sp,sp,16 //将sp+16指向的值存入sp
jr ra //程序跳转指令
.size main, .-main
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits