Как видно из сегодняшней истории вопросов, я работаю над проектом MIPS, который перевернет строку, в данном случае «Hello, World». Я думаю, что у меня есть мои функции разворота цикла и строки, но я не могу понять саму функцию подкачки или как вывести управляемую строку.
Я знаю, что основной своп для чего-то вроде этого будет:
sll $t1, $a1, 2
add $t1, $a0,$t1
lb $t0,0($t1)
lb $t2, 4($t1)
sb $t0,0($t1)
sb $t2, 4($t1)
jr $ra
Но я понятия не имею, что это делает или как я интерпретирую это, чтобы соответствовать моему коду. Если бы какой-нибудь святой мог объяснить, как это работает и как работают системные вызовы, я был бы бесконечно благодарен. Мой код ниже:
.data
string: .asciiz "Hello, World!"
.text
main:
li $v0, 4
la $a0, string #store string in a0
syscall
jal stringreverse
stringreverse:
add $t0,$a0,$zero #base address of string
add $a1, $zero,14 #stores size of string in a1
addi $t2, $a1, -1 #j = length -1
add $t3,$zero,$zero #i = 0
loop:
jal swap
addi $t2,$t2,-1 #j--
addi $t3,$t3,+1 #i++
slt $t7,$t3,$t2 #set t7 to 1 when j is less than i
bne $t7,$zero,loop # if i is greater than j, keep looping
j done
swap: #swaps the sooner element with the later and returns back to the loop
lb $v0,0($t3) # updated to fit my registers t3 =i
lb $v1,0($t2) # updated to fit my registers t2 =j
sb $v1,0($t3)
sb $v0,0($t2)
jr $ra
done:
.....procedure here.....
syscall
char*
указатели повсюду (вместо индексных переменных). Обратите внимание, чтоmain -> reverse -> swap
, поэтому значение$ra
изmain
должно быть сохраненоreverse
, потому чтоjal swap
его затирает. - person Craig Estey   schedule 21.03.2018$s0-$s7
должен быть сохранен (и регистр стека должен при выходе из функции указывать на то же место, где он был записью функции). В противном случае любой рег можно использовать для любых целей. Я намеренно выбрал из колеи использование$v0/$v1
в моемswap
(против$t*
). Единственные действительно зашитые [архитектурой] регистры - это$ra
и$zero
- person Craig Estey   schedule 21.03.2018jal func
, он помещает адрес возврата (адрес послеjal
в регистр$ra
(адрес возврата)), а затем переходит кfunc
. Использование$ra
отjal
- один из немногих вариантов, которые можно использовать заранее. Обычный способ возврата -jr $ra
, что означает переход к адресу в$ra
. Это обычная последовательность, ноjr
не привязан к$ra
, вы можете использовать любой другой регистр (например, в моем коде я использовал$t0
, чтобы проиллюстрировать это:jr $t0
, потому что раньше я сохранил$ra
в$t0
) - person Craig Estey   schedule 21.03.2018$t2/$t3
являются индексами, а не указателями, поэтомуlb
будет ошибкой (например,$t3
имеет ноль в начале).lb $v0,0($t3)
похож наchar v0 = *t3
.lb $v0,5($t3)
будет похоже наchar v0 = *(t3 + 5)
. Итак, ваше обратное действие [на C]:swap(i,j)
вместоswap(&array[i],&array[j])
Я обновил свой ответ на другой вашей странице, чтобы помочь - person Craig Estey   schedule 21.03.2018