对不起,我一直在问我感觉很糟糕的问题。
.data
.align 4
Table: .space 24
msg1: .asciiz "Please insert an integer: "
msg2: .asciiz " "
msg3: .asciiz "\nVector contents: "
.text
.globl main
main:
addi $s0,$zero,5
addi $t0,$zero,0
in:
li $v0,4
la $a0,msg1
syscall
li $v0,5
syscall
add $t1,$t0,$zero
sll $t1,$t0,2
add $t3,$v0,$zero
sw $t3,Table ( $t1 )
addi $t0,$t0,1
slt $t1,$s0,$t0
beq $t1,$zero,in
la $a0,Table
addi $a1,$s0,1 #a1=6
#call buble_sort
jal buble_sort
#print table
li $v0,4
la $a0,msg3
syscall
la $t0,Table
#s0=5
add $t1,$zero,$zero
printtable:
lw $a0,0($t0)
li $v0,1
syscall
li $v0,4
la $a0,msg2
syscall
addi $t0,$t0,4
addi $t1,$t1,1
slt $t2,$s0,$t1
beq $t2,$zero,printtable
li $v0,10
syscall
buble_sort:
#a0=address of table
#a1=sizeof table
add $t0,$zero,$zero #counter1( i )=0
loop1:
addi $t0,$t0,1 #i++
bgt $t0,$a1,endloop1 #if t0 < a1 break;
add $t1,$a1,$zero #counter2=size=6
loop2:
bge $t0,$t1,loop1 #j < = i
#slt $t3,$t1,$t0
#bne $t3,$zero,loop1
addi $t1,$t1,-1 #j--
mul $t4,$t1,4 #t4+a0=table[j]
addi $t3,$t4,-4 #t3+a0=table[j-1]
add $t7,$t4,$a0 #t7=table[j]
add $t8,$t3,$a0 #t8=table[j-1]
lw $t5,0($t7)
lw $t6,0($t8)
bgt $t5,$t6,loop2
#switch t5,t6
sw $t5,0($t8)
sw $t6,0($t7)
j loop2
endloop1:
jr $ra
这不是我的代码,我只是想了解某个地方发生了什么
几个问题.. ALIGN 和 .SPACE 是做什么的?你怎么知道你需要分配多少空间?
我理解大部分代码(至少我认为我理解)但我对 loop1 和 loop2 标签感到困惑。
主要问题:我的问题是程序什么时候回到loop1?如果循环 1 的计数器从 1(来自 addi)开始,它需要达到 6 才能中断。什么时候调用它来增加+1,因为在loop2中
bge $t0,$t1,loop1
除非 $t0 增加,否则这永远不会是真的?$t1 值是数组的值,它是 6。我没有看到程序返回到 loop1 ......所以有人可以向我解释它是怎么做的吗?计数器必须以某种方式达到 6,因为程序运行良好。(从最小到最大打印出各种数组)