Linux操作系统_Lab1

zjc112x 2023-03-14 18:53:22

实验要求:

将一个简单的C程序汇编成LoongArchRISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。

 1.编写c语言代码

int add(int a,int b){
	return a+b;
}
int main(){
	int c=add(3,5);
	return 0;
}

2.将c程序汇编为RISC-V汇编代码

	.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"

 

...全文
66 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧