MIPS汇编语言学习笔记28:使用While循环打印数组

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

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

课程视频

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

 

作者: 高志远

高志远,24岁,男生

《MIPS汇编语言学习笔记28:使用While循环打印数组》有一条评论

  1. 提示:博客中的视频如果播放卡顿可以在阿里云盘上下载/在线看视频:
    「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 ,无需下载极速在线查看,视频原画倍速播放。

高志远进行回复 取消回复

邮箱地址不会被公开。