Linux操作系统lab1

妖精大人 2023-03-14 22:45:10

一、实验目标

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

二、实验过程

编写测试代码如下:

执行:

riscv64-linux-gnu-gcc -S lab1.c -o lab1.s

得到 lab1.s 汇编代码如下:

	.file	"lab1.c"
	.option pic
	.text
	.align	1
	.globl	g
	.type	g, @function
g:
	addi	sp,sp,-32	;sp = sp-32, 栈顶指针sp, 分配g函数的栈空间
	sd	s0,24(sp)		;将栈底指针s0的值保存在sp+24指向的位置中
	addi	s0,sp,32	;s0 = sp+32
	mv	a5,a0			;将a0的值放进a5中,a0存放的是函数参数
	sw	a5,-20(s0)		;将a5的值存放到s0-20指向的位置中
	lw	a5,-20(s0)		;s0-20的值存在a5中
	addiw	a5,a5,3		;将a5的值加3
	sext.w	a5,a5		
	mv	a0,a5			;将a5的值保存到a0,作为函数g的返回值
	ld	s0,24(sp)		;sp+24的值存入s0的位置中
	addi	sp,sp,32	;sp = sp+32,恢复调用g函数之前的栈空间(f的栈空间)
	jr	ra				;无条件跳转,函数返回
	.size	g, .-g
	.align	1
	.globl	f
	.type	f, @function
f:
	addi	sp,sp,-32	;sp = sp-32, 栈顶指针sp, 分配f函数的栈空间
	sd	ra,24(sp)		;ra存放的是返回地址,保存在sp+24指向的位置中
	sd	s0,16(sp)		;将栈底指针s0的值保存在sp+16指向的位置中
	addi	s0,sp,32	;s0 = sp+32
	mv	a5,a0			;将a0的值放进a5中,a0存放的是函数参数
	sw	a5,-20(s0)		;将a5的值存放到s0-20指向的位置中
	lw	a5,-20(s0)		;s0-20的值存在a5中
	mv	a0,a5			;将a5的值保存到a0
	call	g			;调用函数g
	mv	a5,a0			;将a0的值保存到a5
	mv	a0,a5			;将a5的值保存到a0,作为函数f的返回值
	ld	ra,24(sp)		;ra=sp+24,获取main函数的返回地址
	ld	s0,16(sp)		;s0=sp+16,指向main函数的栈空间
	addi	sp,sp,32	;指向main函数栈空间栈顶
	jr	ra				;无条件跳转,函数返回
	.size	f, .-f
	.align	1
	.globl	main
	.type	main, @function
main:
	addi	sp,sp,-16	;修改栈顶指针sp=sp-16,构造函数栈空间
	sd	ra,8(sp)		;ra存放的是返回地址,将ra的值存放到sp+8位置中
	sd	s0,0(sp)		;将栈底指针s0的值保存在sp+16指向的位置中
	addi	s0,sp,16	;s0 = sp + 16
	li	a0,8			;8存到a0中
	call	f			;调用函数f
	mv	a5,a0			;将a0的值保存到a5
	addiw	a5,a5,1		;将a5的值加1
	sext.w	a5,a5		
	mv	a0,a5			;将a5的值保存到a0,作为返回值
	ld	ra,8(sp)		;取回旧的ra
	ld	s0,0(sp)		;取回旧的sp
	addi	sp,sp,16	;回退栈帧
	jr	ra				;无条件跳转,函数返回
	.size	main, .-main
	.ident	"GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
	.section	.note.GNU-stack,"",@progbits

学号SA22225134

 

 

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

571

社区成员

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

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