【MIPS汇编简单算法实例 Lab12】用栈实现函数调用完成 寻找数组中最大值和最小值

6.1MinMax (&×, N, Min, Max)
写一个函数∶搜索大小为“N"个字( word ) 的数组“X",找出其中的最小值和最大值。输
入参数×和N以及返回的最小值和最大值都通过栈传递。(显示最小值和最大值通过调用
MinMax函数实现)

.data 
	arr:.word 13,25,26,37,12,4,99,21,5
.text

main:
	la $t1,arr
	li $t2,9  #len
	addiu $sp,,$sp,-20
	sw $t1,0($sp)
	sw $t2,4($sp)
	sw $ra,16($sp)
	jal fuct
	lw $ra,16($sp)
	lw $t4,8($sp)  #min
	lw $t5,12($sp)  #max
	addiu $sp,$sp,20
	
	li $v0,10
	syscall
	
fuct:
	lw $a0,0($sp)  # &arr
	lw $a1,4($sp)  #len
	li $t0,0 	# i
	add $t2,$a1,-1  # len -1 
	mul $t1,$t0,4
	lw $t1,($t1)
	move $a2,$t1
	move $a3,$t1
loop:
	bgt $t0,$t2,out
	mul $t1,$t0,4
	lw $t1,($t1)
	bgt $t1,$a2,go
	move $a2,$t1
go:
	blt $t1,$a3,go2
	move $a3,$t1
go2:
	addi $t0,$t0,1
	b loop
out:	sw $a2,8($sp)
	sw $a3,12($sp)
	jr $ra
	
	
	

在这里插入图片描述
在这里插入图片描述

以下是对应的 MIPS 汇编代码: ``` # 函数声明 # # 输入: $sp+4: 数组地址 X # $sp+8: 数组大小 N # 输出: $sp+12: 最小值 Min # $sp+16: 最大值 Max MinMax: addi $sp, $sp, -16 # 为了存储局部变量,分配 16 字节的栈空间 sw $ra, 0($sp) # 保存返回地址 lw $t0, 8($sp) # $t0 = N lw $t1, 4($sp) # $t1 = X lw $t2, ($t1) # $t2 = X[0] move $t3, $t2 # Min = X[0] move $t4, $t2 # Max = X[0] addi $t1, $t1, 4 # $t1 指向 X[1] loop: beq $t0, $zero, end # 如果 N == 0,跳到 end lw $t5, ($t1) # $t5 = X[i] slt $t6, $t5, $t3 # $t6 = (X[i] < Min) bne $t6, $zero, found_min # 如果 X[i] < Min,跳到 found_min slt $t6, $t4, $t5 # $t6 = (Max < X[i]) bne $t6, $zero, found_max # 如果 Max < X[i],跳到 found_max addi $t1, $t1, 4 # i++ addi $t0, $t0, -1 # N-- j loop found_min: move $t3, $t5 # Min = X[i] addi $t1, $t1, 4 # i++ addi $t0, $t0, -1 # N-- j loop found_max: move $t4, $t5 # Max = X[i] addi $t1, $t1, 4 # i++ addi $t0, $t0, -1 # N-- j loop end: sw $t3, 12($sp) # 将 Min 存入 $sp+12 sw $t4, 16($sp) # 将 Max 存入 $sp+16 lw $ra, 0($sp) # 恢复返回地址 addi $sp, $sp, 16 # 释放栈空间 jr $ra # 返回 ``` 该函数的基本思路是:用 $t0 寄存器存储数组大小 N,用 $t1 寄存器存储数组地址 X,用 $t2 寄存器存储当前最小值最大值,然后遍历整个数组寻找最小值最大值。遍历过程中,用 $t5 寄存器存储当前元素值,如果 $t5 比当前最小值还小,就更新最小值,如果 $t5 比当前最大值还大,就更新最大值。遍历完成后,将最小值最大值存入栈中,然后返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值