本文已收录到: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?p=28
MIPS 数组
首先参考上节内容,MIPS中的数组:MIPS汇编语言学习笔记27:数组
我们把上节课的代码拷贝过来:
.data Array: .space 12 # 一个整数4字节,共三个整数 .text main: # save to register addi $s0, $zero, 2 addi $s1, $zero, 4 addi $s2, $zero, 6 # register to memory addi $t0, $zero, 0 sw $s0, Array($t0) addi $t0, $t0, 4 sw $s1, Array($t0) addi $t0, $t0, 4 sw $s2, Array($t0)
上述代码的运行结果如下图所示,分别在起始地址为 0x10010000开始的内存区域中存放 2 4 6三个数字,每个数字占用4字节:
MIPS while循环
我们本节内容可以参考之前的MIPS while循环笔记:MIPS汇编语言学习笔记26:MIPS While 循环
代码如下:
.text main: li $a0, 1 # i li $a1, 0 # sum li $a2, 11 # 限制 LOOP: beq $a0, $a2, EXIT add $a1, $a1, $a0 addi $a0, $a0, 1 j LOOP EXIT: li $v0, 10 syscall
使用while循环将寄存器中的值挨个存入内存
我们只需改造第一段代码,将其改造成含有while语句的MIPS汇编代码。其实不难,如果忘记了MIPS数组和MIPS while循环的汇编知识可以去《MIPS汇编语言学习笔记》中找到 26 节和 27节。
过程分析
将寄存器中的值挨个存入内存中,回想C语言中的指针应该会有所感悟,每个int类型的指针占用4字节,*p++即可让指针向后偏移4字节单位。
在MIPS中也一样,只不过是使用寄存器来实现而已,从对指针的操作转向针对内存地址的操作。使用MIPS中的sw指令即可。
在视频讲解过程中我们遇到了一个问题——sw指令无法将寄存器改为动态,无法通过某种方式挨个循历寄存器。
视频讲解:
如果你知道怎么解决,可以回复文章一起交流。
代码
.data Array: .space 12 # 一个整数4字节,共三个整数 .text main: # save to register addi $s0, $zero, 2 addi $s1, $zero, 4 addi $s2, $zero, 6 # while li $a0, 0 # i li $a2, 12 # 限制 LOOP: beq $a0, $a2, EXIT sw $s0, Array($a0) # 此行代码遇到的问题已经在视频中提出,欢迎大家留言讨论。 addi $a0, $a0, 4 j LOOP EXIT:
使用While循环打印数组
接下来我们按照原课程视频中的例子,讲解使用while循环打印输出数组。
具体思路是:使用之前的代码,已经实现将寄存器中的值挨个保存在内存中。
接下来参考 MIPS汇编语言学习笔记26:MIPS While 循环文章,嵌入while语句将打印调用指令写在while循环中。
关于syscall指令打印数字,不清楚的请看第三讲:MIPS汇编语言学习笔记03:print HelloWorld
需要打印的值存入a0寄存器,使用“指针”的思路每次地址+4即可。
视频讲解
代码
.data Array: .space 12 # 一个整数4字节,共三个整数 .text main: # save to register addi $s0, $zero, 2 addi $s1, $zero, 4 addi $s2, $zero, 6 # register to memory addi $t0, $zero, 0 sw $s0, Array($t0) addi $t0, $t0, 4 sw $s1, Array($t0) addi $t0, $t0, 4 sw $s2, Array($t0) # while li $t1, 0 # i li $t2, 12 # lim LOOP: beq $t1, $t2, EXIT lw $a0, Array($t1) li $v0, 1 syscall addi $t1, $t1, 4 j LOOP EXIT: li $v0, 10 syscall
提示:博客中的视频如果播放卡顿可以在阿里云盘上下载/在线看视频:
「2021-09-16-20-19-06.mp4」https://www.aliyundrive.com/s/XnQR75pPzqk
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
「2021-09-16-20-41-05.mp4」https://www.aliyundrive.com/s/DufhBAC3jcW
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。