571
社区成员
发帖
与我相关
我的任务
分享学号:SA22225224
将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用
c程序代码:hello.c
int f(int a, int b){
return a + b;
}
int main(){
int x = 1;
int y = 2;
int k = f(x, y);
return 0;
}
使用如下指令将hello.c汇编成RISC-V汇编代码
riscv64-linux-gnu-gcc -S -o hello.s hello.c
f:
add sp,sp,-32 //sp = sp -32 sp为栈顶指针,分配32字节的栈空间
sd s0,24(sp) //将栈底指针s0存储到sp + 24 地址中
add s0,sp,32 //更新栈底指针为之前sp所指向的栈顶
mv a5,a0 //将a0,a1内容移动到a5,a4中,main函数调用f前将参数保存在了a0和a1
mv a4,a1 //寄存器中
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
jr ra //pc寄存器设置为ra中的值
main:
add sp,sp,-32 //给栈开辟32字节的空间
sd ra,24(sp) //将返回地址ra保存到栈中
sd s0,16(sp) //将s0栈底指针保存到栈中
add s0,sp,32 //s0指向新的基地址
li a5,1 //a5 = 1
sw a5,-28(s0) //将a5 存储到s0 - 28 的位置
li a5,2 //将立即数2存储到a5中
sw a5,-24(s0) //将a5存储到内存中s0-24的位置
lw a4,-24(s0) //将s0-24的内容存储到a4中
lw a5,-28(s0) //将s0-25的内容存储到a5中
mv a1,a4 //移动a4内容到a1
mv a0,a5 //移动a5内容到a0
call f //调用f函数
mv a5,a0 //将a5内容移动到a0
sw a5,-20(s0) //将a5的内容存储到s0-29的韦志中
li a5,0 //将0加载到a5中
mv a0,a5 //将a0的内容移动到a5中
ld ra,24(sp) //恢复ra中的地址
ld s0,16(sp) //恢复栈底指针s0
add sp,sp,32 //恢复栈顶指针sp
jr ra //pc寄存器设置为ra的值
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"