汇编语言作业的麻烦

时间:2011-02-06 20:34:27

标签: assembly mips

我以为我正确实现了一个while循环,但为什么我没有得到任何输出?

我的书并没有那么大的帮助,我也无法在线找到资源。

##### The Data Segment #########

.data
strFirstNumber:     .asciiz  "Enter the first number (0-63): "
strSecondNumber:    .asciiz  "Enter the second number (0-63): "
strError:           .asciiz  "That number is not in the 0-63 range.\n\n"

#### The Text Segment ##########

.text
.globl main

main:
    li $t2, 0
#First Number
    li $10, 64
    li $v0, 4
    la $a0, strFirstNumber
    syscall
    li $v0, 5
    syscall
    blez $v0, in_error
    bgeu $v0, $10, in_error
    j DoneIf

in_error:
    li $v0, 4
    la $a0, strError
    syscall
    li $v0, 4
    la $a0, strFirstNumber
    syscall
    li $v0, 5
    syscall
    bltz $v0, in_error
    bgeu $v0, $10, in_error

DoneIf:
    move $t0, $v0

#Second Number
    li $v0, 4
    la $a0, strSecondNumber
    syscall
    li $v0, 5
    syscall
    bltz $v0, in_error2
    bgeu $v0, $10, in_error2
    j DoneIf2

in_error2:
    li $v0, 4
    la $a0, strError
    syscall
    li $v0, 4
    la $a0, strSecondNumber
    syscall
    li $v0, 5
    syscall
    blez $v0, in_error2
    bgeu $v0, $10, in_error2

DoneIf2:
    move $t1, $v0

Loop:
    beq    $t2, $t0, Exit
    add    $t3, $t1, $t1
    add    $t2, $t2, 1

    j    Loop        # go to Loop

Exit:
    li $v0, 1
    add    $a0, $0, $t3
    syscall

    jr    $31

2 个答案:

答案 0 :(得分:1)

几乎不可能说出什么是错的:

  1. 我们不知道系统调用中发生了什么。
  2. 您正在使用$t个寄存器来存储值。这很糟糕,因为MIPS将它们定义为临时管理员。使用$s0代替$s7
  3. 我们不知道你的目标。这是真正的硬件还是模拟器?
  4. 我们不知道代码是否完整
  5. 顺便说一句,如果你正确输入了两个数字,你的代码必须进入循环。同样,考虑到系统调用可能会破坏寄存器,它可能会运行...很长时间。

    首先尝试更改寄存器分配,然后删除不会将计算结果更改为$t3的循环。并且可能检查您的系统调用是否正常打印。

答案 1 :(得分:0)

这是因为你没有在程序中描述'syscall'中发生了什么过程似乎没有真正的输出结果。