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

本文已收录于 MIPS汇编语言学习笔记 系列,共计 27 篇,本篇是第 15 篇

本文已收录到:MIPS汇编语言学习笔记 专题

原视频:

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

 

程序功能:

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

可参考图:

 

视频讲解:

代码:

.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. 堆(数据结构):堆可以被看成是一棵树,如:堆排序;

 

 


参考文献:https://blog.csdn.net/u014306011/article/details/51044091

作者: 高志远

高志远,24岁,男生

《MIPS汇编语言学习笔记17:将寄存器保存到堆栈》有7条评论

  1. 提示:博客中的视频如果播放卡顿可以在阿里云盘上下载/在线看视频:
    「2021-04-01-11-24-50.mp4」https://www.aliyundrive.com/s/fVP9j8MyWH7
    点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

  2. 支持,讲解很细致,不过私以为有些时候没有必要太过详细关于C的内容,应该不会有人不学C直接学MIPS吧。。。orz

    1. 哈哈哈,好建议,我也觉得不会有人直接学汇编,就是讲的时候顺口不小心带了一下C :huaji11:

高志远进行回复 取消回复

邮箱地址不会被公开。