Mips сборка псевдоинструкций - PullRequest
0 голосов
/ 22 мая 2018

Я только что закончил задание и обнаружил, что использую «псевдоинструкции», которые мне запрещено использовать в этом задании.

Я попытался выяснить, как преобразовать его в «»настоящий "код, но я понятия не имею, с чего начать ...

Я буду рад, если кто-нибудь мне поможет:

Есть две функции:

  • первый получает два положительных числа и возвращает остаток при делении друг на друга (возвращает -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

какя могу это сделать?

...