Я только что закончил задание и обнаружил, что использую «псевдоинструкции», которые мне запрещено использовать в этом задании.
Я попытался выяснить, как преобразовать его в «»настоящий "код, но я понятия не имею, с чего начать ...
Я буду рад, если кто-нибудь мне поможет:
Есть две функции:
первый получает два положительных числа и возвращает остаток при делении друг на друга (возвращает -1, если нет напоминания)
второй получает массив и число ивозвращает число делений в массиве без остатка - используя первую функцию.
Наконец, в основном - проверяет, все ли числа в массиве были разделены без остатка -если это так - сброс всех чисел в ноль.
Вот мой код:
.data
arr: .word 85, 36, 94, 45, 29, 85, 12, 89, 20, 0
.text
main:
lui $s0, 0x1001
add $a0, $s0, $zero
# call count_multiple with the value we want to divide in a1
add $a1, $zero, 5
jal count_multiple
beq $v1, $t5, resetArray # if every value in the array dividing by 5 - reset the array to zero
# printing the returned value (the number of values that divided in a1)
li $v0,1
addi $a0, $v1, 0
syscall
# the program is done - close
li $v0, 10
syscall
remainder:
addi $v1, $zero, 0 #reset v1
loop:
slt $t0, $a0, $a1 # if(a0<a1) t0=1 else t0=0
bne $t0, $zero, exitloop # if(t0!=0) exitloop
sub $a0, $a0, $a1 # else a0=a0-a1
j loop # keep looping
exitloop:
beq $a0, $zero, ifzero # if(a0=0) jump to ifzero
add $v1, $a0, $zero # else v1=a0=remainder (v1 is the returned value)
jr $ra # jump back to the program
ifzero:
addi $v1, $v1, -1 # v1 = -1 if the remainder is 0
jr $ra # jump back to the program
count_multiple:
addi $sp, $sp, 4
sw $ra, 0($sp)
while:
lw $s0, arr($t6) # load to s0 array value in index t6
beq $s0, 0, exitwhile # exit when you get 0
addi $t5, $t5, 1 # t5 counting the numbers in the array
add $a0, $zero, $s0 # a0 = t1, a0 is the number we want to check in "remainder" method
jal remainder # call remainder
addi $t6, $t6, 4 # t6=t6+4 (index++)
addi $t3, $zero, -1 # t3=-1
bne $t3, $v1, while # if v1 (return from remainder method) !=t3(-1) -> go back to while loop
addi $t4, $t4, 1 # else - t4 = counter = ++
j while # go back to while loop
exitwhile:
add $v1, $zero, $t4 # v1=v1+counter
lw $ra, 0($sp)
jr $ra # return v1
resetArray:
addi $sp, $sp, 4
sw $ra, 0($sp)
addi $t6, $zero, 0 # reset index t6
resetLoop:
lw $s0, arr($t6) # load to s0 array value in index t6
beq $s0, 0, exitResetLoop # exit when you get 0
sw $zero, arr($t6) # reset the value to 0
addi $t6, $t6, 4
j resetLoop
exitResetLoop:
также я хочу преобразовать инициализирующий массив в:
arr: .word 85, 36, 94, 45, 29, 85, 12, 89, 20, 0
какя могу это сделать?