跳转到各种功能MIPS

问题描述 投票:0回答:1

所以我是MIPS的新手,我想实现简单的模运算功能。我无法看到为什么程序没有根据代码中的跳转语句跳转。任何帮助,将不胜感激。

    .data
text_enquiry    :   .asciiz "Enter operation code (1-add, 2-subtract, 3-multiply, 4-exponentiation, 5-inversion, 6-exit): "
text_a          :   .asciiz "Enter a: "
text_b          :   .asciiz "Enter b: "
text_m          :   .asciiz "Enter m: "
text_result     :   .asciiz "Result = "
new_line        :   .asciiz "\n"

    .text
main:

    ##  t0 = code, t1 = a, t2 = b, t3 = m

    #print operation message
    la      $a0, text_enquiry
    li      $v0, 4
    syscall

    #read code
    li      $v0, 5
    syscall
    move    $t0, $v0

    #if code == 6
    beq     $t0, 6, exit
    j       rest

exit:
    li      $v0, 10
    syscall

    #else, continue procedure

    #print 'a, b, m' messages and read them
rest:
    la      $a1, text_a
    li      $v0, 4
    syscall
    li      $v0, 5
    syscall
    move    $t1, $v0

    la      $a1, text_b
    li      $v0, 4
    syscall
    li      $v0, 5
    syscall
    move    $t2, $v0

    la      $a1, text_m
    li      $v0, 4
    syscall
    li      $v0, 5
    syscall
    move    $t3, $v0
    j       mod

    ##  t0 = code, t1 = a, t2 = b, t3 = m, t4 = un-modded result, t5 = modded result, t6 = 
mod:
    beq     $t0, 1, func_add
    beq     $t0, 2, func_sub
    beq     $t0, 3, func_mul
    # beq       $t0, 4, func_exp

func_add:
    add     $t4, $t1, $t2
    div     $t4, $t3
    mfhi    $t5
    #print accordingly
    la      $a3, text_result
    li      $v0, 4
    syscall
    move    $a3, $t5
    li      $v0, 1
    syscall
    la      $a3, new_line
    li      $v0, 4
    syscall

    j       main

func_sub:
    sub     $t4, $t1, $t2
    div     $t4, $t3
    mfhi    $t5
    #print accordingly
    la      $a3, text_result
    li      $v0, 4
    syscall
    move    $a3, $t5
    li      $v0, 1
    syscall

    j       main

func_mul:
    mult    $t1, $t2
    mflo    $t4
    div     $t4, $t3
    mfhi    $t5
    #print accordingly
    la      $a3, text_result
    li      $v0, 4
    syscall
    move    $a3, $t5
    li      $v0, 1
    syscall

    j       main

正如您所看到的,代码为“6”时代码工作正常,但不适用于任何其他代码值。

if-statement assembly mips
1个回答
2
投票

我无法看到为什么程序没有根据代码中的跳转语句跳转。任何帮助,将不胜感激。

您的程序根据输入跳转。

您无法看到的是它真正的作用以及为什么您的进一步文本输出失败,而您无法看到它,因为您甚至看不到(在调试器中,单步执行每条指令)。

你会看一下,你会清楚地看到例如输入“3”,代码将在标签rest:之后到达指令,因此分支是正确的。

该代码后来没有按照您的期望进行操作,因为它不会打印其他帮助器提示,因为它使用错误的参数调用syscall(代码将a1设置为字符串地址,而不是a0,并且在a0中仍然是原始操作 - 提示地址),但它按计划执行。

通常只通过检查输入/输出来决定汇编代码的正确性是非常糟糕的做法,因为你经常可以“偶然”输出正确的输出,而代码已经做了不同于计划的事情,如果你以后可能只会咬你继续扩展您的代码,或者如果您使用不同的输入。

要确定您的汇编代码是否正确,您应该在调试器中花费相当长的时间,验证不同的输入,并考虑代码是如何工作的,如果真的按计划/假设工作,那么在您编写它时 - 基于每个指令!

最终代码应仅包含您完全知道它们正在做什么的指令,以及为什么它们是代码的一部分,以及为什么它们被放置在它们所在的位置。如果在没有你真正了解它的情况下“偶然”工作,你必须修复它(通过了解它是如何工作的,或者以你理解它是如何工作的方式重写它),即使输出是正确的,它仍然是bug。

© www.soinside.com 2019 - 2024. All rights reserved.