1

对不起,我一直在问我感觉很糟糕的问题。

  .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,因为程序运行良好。(从最小到最大打印出各种数组)

4

1 回答 1

2

使用 MARS 模拟器(是的,我知道“模拟器”是多余的,一旦人们不再提及 ATM 机和 PIN 码,我就会修复它),.align 4将对齐设置为 16 的倍数()。例如,它将确保将位于 16 字节边界上,如、或。对齐通常是因为如果-byte 数据元素在-byte 边界上对齐,则某些 CPU 工作得更快(如果违反对齐,有些甚至会引发硬件异常)但我不确定这里的情况是否如此,因为 16 的对齐非常漂亮“宽的”。24Table00004110fff0nn

.space 24只需分配 24 个字节的空间,在这种情况下用于保存Table数据结构。

$s0根据和之间的交互,您的初始循环(输入数据)似乎有六个条目的限制$t0

指令顺序:

slt $t1,$s0,$t0
beq $t1,$zero,in

in只要$s0(= 5) 小于,就会分支回到$t0,因此$t0迭代 from05包含 (六个项目)。

限制是您决定分配多少空间的方式(六个 32 位值将是 24 个字节)。


这个循环起作用。您声明:

bge $t0,$t1,loop1:除非增加,否则这永远不会是真的$t0

但事实上,这并不完全正确,如果你递减它也可能成为真的,你$t1,它在下面的第三non-':'行代码 ( ) 中:

loop2:
bge $t0,$t1,loop1 #j < = i
:
addi $t1,$t1,-1 #j--
:
j loop2

从伪代码的角度考虑,它与这两个循环相同(就完成了多少次迭代而言):

limit = 10, value = 0      limit = 10, value = 0
while value < limit:       while value < limit:
    value = value + 1          limit = limit - 1
于 2014-03-19T05:01:42.623 回答