有人能解释一下这个代码的某个部分发生了什么吗?(MIPS/组装)

有人能解释一下这个代码的某个部分发生了什么吗?(MIPS/组装),mips,subroutine,mars-simulator,Mips,Subroutine,Mars Simulator,对不起,我一直在问问题,我感觉很糟糕 .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

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

  .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
除非$t0增加,否则这永远不会是真的$t1值是数组的值,即6。 我看不到程序会回到循环1。。。有人能给我解释一下吗?由于程序运行良好,计数器必须以某种方式达到6。(从最小到最大打印各种阵列)

使用火星模拟器(是的,我知道“模拟器”是多余的,一旦人们不再参考ATM机和PIN码,我就会修复它),
.align 4
将对齐设置为十六的倍数(
24
)。例如,它将确保
位于16字节边界上,如
0000
4110
fff0
。对齐通常是因为如果
n
-字节数据元素在
n
-字节边界上对齐,某些CPU的工作速度会更快(如果违反对齐,有些CPU甚至会引发硬件异常),但我不确定这里的情况是否如此,因为十六字节的对齐相当“宽”

.space 24
只分配24个字节的空间,在本例中用于保存
数据结构

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

指令序列:

slt $t1,$s0,$t0
beq $t1,$zero,in
只要
$s0
(=
5
)小于
$t0
,则将分支回
中的
,因此
$t0
0
迭代到
5
(包括六项)

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


这个循环会起作用。你声明:

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

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

loop2:
bge $t0,$t1,loop1 #j < = i
:
addi $t1,$t1,-1 #j--
:
j loop2
loop2:
bge$t0,$t1,loop1#j<=i
:
附加$t1,$t1,-1#j--
:
j循环2
从伪代码的角度考虑,它与这两个循环相同(就完成了多少次迭代而言):

limit=10,value=0 limit=10,value=0
当值<限制:当值<限制:
值=值+1限制=限制-1

我还是不明白你怎么知道你需要多少空间?我假设只使用你需要的空间,而不放置一个随机的高数字是更为理想的?输入数据的限制是6。或者至少该代码要求输入数字6次。但是如果我把空格改小一点,它会让我输入一个数字,如果有意义的话,它不会输出文本要求我输入数字。无论如何,谢谢你的帮助:D我开始觉得有点道理了。。现在我只是希望有人能回答我关于实际代码++的问题。谢谢大家!@Jpyo,那是因为,如果你给五个数字留出空间并输入/存储六个数字,那么第六个数字将覆盖
msg1
,这是内存中的下一个东西。哦,我的天啊,哈哈。我真不敢相信我没有看到它。我的意思是我看到了它,但我忽略了它,因为我一直在努力寻找$t0增加的地方,所以我没有检查$t1是否减少,尽管我已经在我的论文x_o上写下了它!!!我倾向于只考虑一种可能性而忽略其他可能性,因此,我在编写代码时会陷入很多麻烦,因为我看不到其他方法来处理它。非常感谢。如果我能投票一百万次,我会的。
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