Mips程序集伪指令

时间:2018-05-22 17:08:04

标签: assembly mips instruction-set

我刚完成一项任务,发现我使用的是“伪指令”,我不允许在此作业中使用。

我试图找出如何将其转换为“真正的”代码,但我不知道从哪里开始......

如果有人可以指导我,我会很高兴:

有两个功能:

  • 第一个获得两个正数,并在彼此分开时返回余数(如果没有提醒则返回-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

我该怎么做?

0 个答案:

没有答案