Может кто-нибудь объяснить мне, что происходит в определенной части этого кода? (МИПС/СБОРКА)

Извините, что продолжаю задавать вопросы, мне так плохо.

  .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.

ГЛАВНЫЙ ВОПРОС: Мой вопрос: когда программа когда-либо возвращается к циклу 1? Если счетчик для цикла 1 начинается с 1 (от addi), он должен достичь 6, чтобы прерваться. Когда он когда-либо вызывался для увеличения +1, потому что в цикле2

bge $t0,$t1,loop1

Это НИКОГДА не будет правдой, если $t0 не будет увеличен? Значение $t1 - это значение массива, равное 6. Я не вижу, чтобы программа когда-либо возвращалась к циклу1... так что может ли кто-нибудь объяснить мне, как это происходит? Счетчик должен каким-то образом достичь 6, потому что программа работает нормально. (Распечатка отсортированного массива от меньшего к большему)


person Jpyo    schedule 19.03.2014    source источник


Ответы (1)


С симулятором MARS (да, я знаю, что слово «симулятор» избыточно, и я исправлю его, как только люди перестанут ссылаться на банкоматы и PIN-коды), .align 4 установит выравнивание, кратное шестнадцати (24). Например, это гарантирует, что Table будет находиться на шестнадцатибайтовой границе, такой как 0000, 4110 или fff0. Выравнивание обычно происходит потому, что некоторые ЦП работают быстрее, если элементы данных размером n байт выровнены по границе n байт (некоторые даже вызовут аппаратное исключение, если выравнивание нарушено), но я не уверен, что здесь это так, поскольку выравнивание шестнадцати довольно "широкий".

.space 24 просто выделяет двадцать четыре байта пространства, в данном случае для хранения структуры данных Table.

Похоже, что ваш первоначальный цикл (ввод данных) имеет ограничение в шесть записей, основанное на взаимодействии между $s0 и $t0.

Последовательность инструкций:

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

будет возвращаться к in до тех пор, пока $s0 (= ​​5) меньше $t0, поэтому $t0 выполняет итерацию от 0 до 5 включительно (шесть элементов).

Это ограничение — это то, как вы решаете, сколько места выделять (шесть 32-битных значений составляют двадцать четыре байта).


И этот цикл будет работать. Вы утверждаете, что:

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
person paxdiablo    schedule 19.03.2014
comment
Я до сих пор не понимаю, откуда вы знаете, сколько места вам нужно? Я предполагаю, что более оптимально использовать только то пространство, которое вам нужно, а не ставить случайное большое число? - person Jpyo; 19.03.2014
comment
ввод данных имеет ограничение 6. Или, по крайней мере, код запрашивает число 6 раз. Но если я изменил пробел на меньшую величину, он позволит мне ввести число, он просто не выведет текст, чтобы спросить меня о числе, если это имеет смысл. В любом случае, спасибо за помощь :D Это начинает обретать для меня смысл. Теперь я просто надеюсь, что кто-нибудь сможет ответить на мой вопрос о фактическом коде +_+ . Спасибо! - person Jpyo; 19.03.2014
comment
@Jpyo, это потому, что если вы оставите место для пяти чисел и введете / сохраните шесть, шестое перезапишет msg1, следующее в памяти. - person paxdiablo; 19.03.2014
comment
О боже, лол. Не могу поверить, что я этого не видел. Я имею в виду, что я видел это, но я проигнорировал это из-за того, что я так усердно искал, где увеличивается $t0, что я не удосужился проверить, уменьшилось ли значение $t1, хотя я записал это на своей бумаге x_o!!! - person Jpyo; 19.03.2014
comment
У меня есть тенденция рассматривать только одну возможность и забывать о других, поэтому я много путаю при написании кода, потому что не вижу других способов приблизиться к нему. Спасибо! Если бы я мог проголосовать миллион раз, я бы это сделал. - person Jpyo; 19.03.2014
comment
Нет проблем, @Jpyo, рад, что смог помочь. Но если бы вы могли проголосовать миллион раз, то могли бы и все остальные, и я все еще не был бы рядом с представителем Джона Скита :-) - person paxdiablo; 19.03.2014
comment
@paxdiablo На самом деле .align 4 - это выравнивание по 16 байтам. .align n выравнивается по границе 2^n байта. - person Konrad Lindenbach; 19.03.2014
comment
@Konrad, я исправлен и обновил ответ. Спасибо за предупреждение. - person paxdiablo; 19.03.2014