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程序,效率方面可能不理想。后面有时间会改进。