mips程序设计——直接插入排序的递归与非递归实现(spim模拟)
来源:互联网 发布:纸模型高达 知乎 编辑:程序博客网 时间:2024/05/21 09:54
非递归形式源码:
.dataarray:.space 1024 #开辟数组空间input_number_msg:.asciiz "Please input number of integers: " input_integer_msg:.asciiz "Please input integers to be sorted: " output_integer_msg:.asciiz "The sorted integers are: " .textmain: la $a0,input_number_msg #提示输入待排序整数数目 li $v0,4 syscall li $v0,5 syscall la $t6,array move $t7,$zero #初始化t7,用于循环计数 move $t8,$v0 #t8用于存放待排序整数数目input: la $a0,input_integer_msg #提示输入待排序整数 li $v0,4 syscall li $v0,5 syscall move $t0,$t7 mul $t0,$t0,4 addu $t1,$t0,$t6 sw $v0,0($t1) addi $t7,$t7,1 blt $t7,$t8,input #输入待排序整数,直至达到t8中的给定数目 move $t2,$zero #t2用于插入排序的外层循环计数insertion_sort: addi $t2,$t2,1 #i=i+1 bge $t2,$t8,output #若循环次数达到给定整数数目,跳转至输出 mul $t1,$t2,4 addu $t1,$t1,$t6 lw $t3,0($t1) #t3=array[i] sub $t4,$t2,1 mul $t4,$t4,4 addu $t4,$t4,$t6 lw $t4,0($t4) #t4=array[i-1] bge $t3,$t4,insertion_sort #如果array[i]>=array[i-1],检查数组的下一个元素值 move $t0,$t3 #否则,将t3的值设为key,存入t0 sw $t4,0($t1) #array[i]=array[i-1] sub $t3,$t2,2 #j=i-2inner_loop: mul $t4,$t3,4 addu $t4,$t4,$t6 lw $t4,0($t4) #t4=array[j] bge $t0,$t4,backspace #如果key>=array[j],array[j+1]=key addi $t5,$t3,1 #否则,array[j+1]=array[j] mul $t5,$t5,4 addu $t5,$t5,$t6 sw $t4,0($t5) sub $t3,$t3,1 #j=j-1 beq $t3,-1,backspace #如果j==-1,array[j+1]=key b inner_loopbackspace: addi $t3,$t3,1 mul $t3,$t3,4 addu $t3,$t3,$t6 sw $t0,0($t3) #array[j+1]=key blt $t2,$t8,insertion_sort #如果i<t8,检查下一个元素值 output: la $a0,output_integer_msg #输出排序后的整数 li $v0,4 syscall move $t7,$zero print_loop: move $t0,$t7 mul $t0,$t0,4 addu $t1,$t0,$t6 lw $a0,0($t1) li $v0,1 syscall addi $t7,$t7,1 blt $t7,$t8,print_loop jr $ra
递归形式源码:
.dataarray:.space 1024 #开辟数组空间input_number_msg:.asciiz "Please input number of integers: "input_integer_msg:.asciiz "Please input integers to be sorted: "output_integer_msg:.asciiz "The sorted integers are: " .text##主函数,调用插入排序函数和输出函数main: subu $sp,$sp,4 sw $ra,0($sp) #main的返回地址入栈 la $a0,input_number_msg #提示输入待排序整数数目 li $v0,4 syscall li $v0,5 syscall la $t6,array move $t7,$zero #初始化t7,用于循环计数 move $t8,$v0 #t8用于存放待排序整数数目input: la $a0,input_integer_msg #提示输入待排序整数 li $v0,4 syscall li $v0,5 syscall move $t0,$t7 mul $t0,$t0,4 addu $t1,$t0,$t6 sw $v0,0($t1) addi $t7,$t7,1 blt $t7,$t8,input #输入待排序整数,直至达到t8中的给定数目 move $a0,$t8 #整数的数目n作为函数参数存入a0 jal insertion_sort #调用插入排序函数 jal output #调用输出函数 lw $ra,0($sp) #main的返回地址出栈 addi $sp,$sp,4 jr $ra##插入排序函数insertion_sort(n)insertion_sort: subu $sp,$sp,32 #保存现场 sw $ra,28($sp) sw $fp,24($sp) sw $s0,20($sp) addi $fp,$sp,32 move $s0,$a0 #s0=n-1 blt $s0,1,sort_ret #如果s0<1,递归结束 sub $a0,$s0,1 #a0=s0-1 jal insertion_sort #insertion_sort(n-1) beq $s0,$t8,sort_ret #如果s0==t8,函数终止 mul $t1,$s0,4 addu $t1,$t1,$t6 lw $t3,0($t1) #t3=array[n] sub $t4,$s0,1 mul $t4,$t4,4 addu $t4,$t4,$t6 lw $t4,0($t4) #t4=array[n-1] bge $t3,$t4,sort_ret #如果array[n]>=array[n-1],继续递归 move $t0,$t3 #否则,将t3的值设为key,存入t0 sw $t4,0($t1) #array[i]=array[i-1] sub $t3,$s0,2 #j=n-2 beq $t3,-1,backspace #如果j==-1,array[j+1]=keyinner_loop: mul $t4,$t3,4 addu $t4,$t4,$t6 lw $t4,0($t4) #t4=array[j] bge $t0,$t4,backspace #如果key>=array[j],array[j+1]=key addi $t5,$t3,1 #否则,array[j+1]=array[j] mul $t5,$t5,4 addu $t5,$t5,$t6 sw $t4,0($t5) sub $t3,$t3,1 #j=j-1 beq $t3,-1,backspace #如果j==-1,array[j+1]=key b inner_loopbackspace: addi $t3,$t3,1 mul $t3,$t3,4 addu $t3,$t3,$t6 sw $t0,0($t3) #array[j+1]=keysort_ret: lw $ra,28($sp) #恢复现场 lw $fp,24($sp) lw $s0,20($sp) addi $sp,$sp,32 jr $ra##输出排序后的整数 output: subu $sp,$sp,32 #保存现场 sw $ra,28($sp) sw $fp,24($sp) sw $t0,20($sp) sw $t1,16($sp) sw $t6,12($sp) sw $t7,8($sp) addi $fp,$sp,32 la $a0,output_integer_msg li $v0,4 syscall move $t7,$zero print_loop: move $t0,$t7 mul $t0,$t0,4 addu $t1,$t0,$t6 lw $a0,0($t1) li $v0,1 syscall addi $t7,$t7,1 blt $t7,$t8,print_loop lw $ra,28($sp) #恢复现场 lw $fp,24($sp) lw $t0,20($sp) lw $t1,16($sp) lw $t6,12($sp) lw $t7,8($sp) addi $sp,$sp,32 jr $ra
初次写mips程序,效率方面可能不理想。后面有时间会改进。
- mips程序设计——直接插入排序的递归与非递归实现(spim模拟)
- 直接插入排序的递归与非递归实现
- 直接插入排序的实现(递归和非递归)
- 直接插入排序(递归与非递归2种实现方法)
- 递归到非递归转换——归并排序与快排的非递归实现
- 归并排序(递归与非递归)的实现
- 递归与非递归插入排序
- 归并排序的递归实现与非递归实现
- 归并排序的递归实现与非递归实现
- 全排序的递归与非递归的实现
- 快速排序递归与非递归实现
- 归并排序 递归与非递归实现
- 归并排序递归与非递归实现
- 快速排序的递归与非递归实现
- 归并排序递归与非递归的实现
- 链表归并排序的递归与非递归实现
- 归并排序的递归与非递归实现Java
- 快速排序的递归与非递归实现
- 砸蛋问题
- 大中型网站网站(B/S开发中) cache应用(多图)
- 30个CSS3新功能的实用教程
- HTML发展历史
- Linux互斥锁、条件变量和信号量
- mips程序设计——直接插入排序的递归与非递归实现(spim模拟)
- 华为 EchoLife HG522无线猫设置图解 电信封杀路由全部搞定
- vi的使用
- c#中实现接口与显式实现接口的区别
- 用java调用oracle存储过程总结
- IE6-7子级浮动元素撑开父级元素【BUG】
- T-SQL语句显示级联依赖关系 .
- JavaSE学习笔记--内省
- 黑马程序员--交通灯管理系统