MIPS装配分支(如果小于 [英] MIPS Assembly Branch If Less Than

查看:17
本文介绍了MIPS装配分支(如果小于的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在开发一个非常基本的MIPS程序,它可以计算一些关于门票销售的东西。我已经实现了所有功能,但是当我执行if语句(BLT-->BLT-->BRANCH IF LISH)时,我遇到了一些错误。我在临时寄存器中存储了以下数据:

- $t0 = # of VIP tickets.
- $t1 = # of General Admission tickets.
- $t2 = # of Box Office tickets.
- $t4 = Average ticket sales.

我检查了是否相应地存储了这些值,并且如果条件为假,则代码确实可以工作,但如果满足条件,它将进行分支,并且仍然在分支之前打印代码。以下是我的部分代码:

  blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  b VIP_GREAT
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
  VIP_GREAT:
    li $v0, 4
    la $a0, great_avg_vip
    syscall 
  blt $t1, $t4, GEN_LESS # if $t1 < $t4 then GEN
  b GEN_GREAT
  GEN_LESS:
    li $v0, 4
    la $a0, less_avg_general
    syscall
  GEN_GREAT:
    li $v0, 4
    la $a0, great_avg_general
    syscall 
  blt $t2, $t4, BOX_LESS  # if $t2 < $t4 then BOX_LESS
  b BOX_GREAT
  BOX_LESS:
    li $v0, 4
    la $a0, less_avg_box
    syscall 
  BOX_GREAT:
    li $v0, 4
    la $a0, great_avg_box
    syscall 
  li $v0, 4
  la $a0, endl
  syscall

有谁知道我为什么对此有意见吗?我的程序的输出类似于:

VIP: 1349 tickets
General: 5278 tickets
Box: 4367 tickets

Average: 3215 tickets

VIP: Less than average.
General: Greater than average.
General: Less than average.
Box: Greater than average.
Box: Less than average.

编辑:工作代码。

 blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  li $v0, 4
  la $a0, great_avg_vip
  syscall
  j GENERAL_IF
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
  GENERAL_IF: 
    blt $t1, $t4, GEN_LESS # if $t1 < $t4 then GEN
    li $v0, 4
    la $a0, great_avg_general
    syscall 
    j BOX_IF
    GEN_LESS:
      li $v0, 4
      la $a0, less_avg_general
      syscall
  BOX_IF:
    blt $t2, $t4, BOX_LESS  # if $t2 < $t4 then BOX_LESS
    li $v0, 4
    la $a0, great_avg_box
    syscall 
    j END_IF
    BOX_LESS:
      li $v0, 4
      la $a0, less_avg_box
      syscall 
  END_IF:
    li $v0, 4
    la $a0, endl
    syscall 

推荐答案

您只需要一些无条件的分支,这样就不会同时执行大于和小于代码路径,例如

  blt $t0, $t4, VIP_LESS  # if $t0 < $t4 then VIP
  li $v0, 4
  la $a0, great_avg_vip
  syscall 
                <<< you need an unconditional branch here to VIP_GE
  VIP_LESS:
    li $v0, 4
    la $a0, less_avg_vip
    syscall 
    xor $a0, $a0, $a0
  VIP_GE:       <<< label here so that you can skip previous block
  ...

您需要为三个If/Else块中的每一个执行此操作。

这篇关于MIPS装配分支(如果小于的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆