MIPS汇编语言学习笔记17:将寄存器保存到堆栈

原视频:

https://www.bilibili.com/video/BV19J411y7pA?t=49&p=17

程序功能:

通过函数传递参数过程,理解和使用堆栈(push和pop)。

可参考图:

MIPS汇编语言学习笔记17:将寄存器保存到堆栈_第1张图片

视频讲解:

MIPS汇编语言学习笔记17:将寄存器保存到堆栈 - 高志远的个人主页本文已收录到:MIPS汇编语言学习笔记 专题 MIPS汇编语言学习笔记03:print HelloWorld MIPS汇编语言学习笔记04:print character MIPS汇编语言学习笔记05:print integer MIPS汇编语言学习笔记06:print a float MIPS汇编语言学习笔记07:print a dou……https://gaozhiyuan.me/assembly/mips-assembly-programming-simplified-saving-registers-to-the-stack.html

MIPS汇编语言学习笔记17:将寄存器保存到堆栈_第2张图片

MIPS汇编语言学习笔记17:将寄存器保存到堆栈_第3张图片

 

代码:

.text
	main:
		# 四个参数 g h i j 存在$a0-$a3寄存器中
		addi $a0, $zero, 10
		addi $a1, $zero, 30
		addi $a2, $zero, 10
		addi $a3, $zero, 0
		
		# 调用leaf_example函数
		jal leaf_example
		
		# 打印
		addi $v0, $zero, 1
		syscall 
		
		# 宣告主程序结束
		li $v0, 10
		syscall 
	leaf_example:
		# 因为要将函数中用到的变量 f,(g+h),(i+j) 暂时存放起来,存放在哪里?答:放在stack中。
		# 下面进行压栈操作
		# 先将sp指针(stack pointer)向低字节方向移动12字节
		addi $sp, $sp, -12
		# 将子函数中的三个变量压栈
		sw $t1, 0($sp)
		sw $t0, 4($sp)
		sw $s0, 8($sp)
		
		# 函数内部
		add $t0, $a0, $a1
		add $t1, $a2, $a3
		sub $s0, $t0, $t1
		add $a0, $zero, $s0
		
		# pop
		lw $s0, 8($sp)
		lw $t0, 4($sp)
		lw $t1, 8($sp)
		jr $ra

堆和栈的区别:

一、堆栈空间分配的区别:
1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表

二、堆和栈缓存方式的区别:
1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构的区别:

  1. 栈(数据结构):一种先进后出的数据结构。
  2. 堆(数据结构):堆可以被看成是一棵树,如:堆排序;

你可能感兴趣的:(MIPS汇编语言学习笔记,mips,反汇编,堆栈)