本文已收录到:MIPS汇编语言学习笔记 专题
- MIPS汇编语言学习笔记03:print HelloWorld
- MIPS汇编语言学习笔记04:print character
- MIPS汇编语言学习笔记05:print integer
- MIPS汇编语言学习笔记06:print a float
- MIPS汇编语言学习笔记07:print a double
- MIPS汇编语言学习笔记08:Adding Integers
- MIPS汇编语言学习笔记09:Subtracting Integers
- MIPS汇编语言学习笔记10:Multiplying Integers (mul方法)
- MIPS汇编语言学习笔记11:Multiplying Integers (mult方法)
- MIPS汇编语言学习笔记12:Multiplying Integers sll
- MIPS汇编语言学习笔记13:Dividing Integers part 1
- MIPS汇编语言学习笔记14:Dividing Integers part 2
- MIPS汇编语言学习笔记15:Introduction to Functions
- MIPS汇编语言学习笔记16:Function Arguments and Return Values
- MIPS汇编语言学习笔记17:将寄存器保存到堆栈
- MIPS汇编语言学习笔记18:函数嵌套调用、递归
- MIPS汇编语言学习笔记19:获取用户输入的整数
- MIPS汇编语言学习笔记20:获取用户输入的单精度浮点数
- MIPS汇编语言学习笔记21:获取用户输入的双精度浮点数
- MIPS汇编语言学习笔记22:获取用户输入的文本
- MIPS汇编语言学习笔记23:if 语句分支指令
- MIPS汇编语言学习笔记26:MIPS While 循环
- MIPS汇编语言学习笔记27:数组
- MIPS汇编语言学习笔记28:使用While循环打印数组
- MIPS汇编语言学习笔记29:数组初始化
- MIPS汇编语言学习笔记30:浮点数(小数)运算
- MIPS汇编语言学习笔记32:浮点数 与 If 语句
原视频:
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、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、堆栈数据结构的区别:
- 栈(数据结构):一种先进后出的数据结构。
- 堆(数据结构):堆可以被看成是一棵树,如:堆排序;
参考文献:https://blog.csdn.net/u014306011/article/details/51044091
提示:博客中的视频如果播放卡顿可以在阿里云盘上下载/在线看视频:
「2021-04-01-11-24-50.mp4」https://www.aliyundrive.com/s/fVP9j8MyWH7
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
我感觉最后是不是得把 $sp 指回来呀,倒数第二句加个 addi $sp,$sp,12
是的,应该加上这句
支持,讲解很细致,不过私以为有些时候没有必要太过详细关于C的内容,应该不会有人不学C直接学MIPS吧。。。orz
哈哈哈,好建议,我也觉得不会有人直接学汇编,就是讲的时候顺口不小心带了一下C :huaji11:
捉虫,lw $s0, 8($sp)应该是lw $s0, 0($sp)。。。刚开始还没看懂QAQ
两者意思一样,应该还是MARS软件伪代码的原因。 OωO