Беда с домашним языком на ассемблере - PullRequest
1 голос
/ 06 февраля 2011

Я думал, что правильно реализовал цикл 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 ]

1 голос
/ 25 февраля 2011

Почти невозможно сказать, что не так:

  1. мы не знаем, что происходит в системных вызовах.
  2. вы используете $t регистры для хранения значения. Это плохо, потому что MIPS определяют их как регуляторы нуля. Используйте $s0 до $s7 вместо
  3. мы не знаем вашу цель. Это настоящий HW или эмулятор?
  4. мы не знаем, завершен ли код

Кстати, если вы правильно ввели оба числа, ваш код должен войти в цикл. Опять же, учитывая, что системные вызовы, вероятно, уничтожают регистры, они могут работать ... долго ... время.

Попробуйте сначала изменить распределение регистров, затем удалите цикл, который не меняет результат, вычисленный в $t3. И, возможно, проверьте, что ваш системный вызов для печати работает правильно.

0 голосов
/ 10 мая 2014

Это потому, что вы не описали в программе, какой процесс происходит в 'системном вызове'. Кажется, что нет никакого реального результата.

...