MIPS / Assembly, как повторить ввод при ошибке - PullRequest
0 голосов
/ 14 апреля 2020

Я только начал изучать mips в этом семестре, и мне трудно понять некоторые концепции. Что я пытаюсь сделать, это попросить пользователя ввести два числа, первое и последнее. Программа должна вычислить сумму между (включительно) этими числами, и, если последний> первый (6> 3, но 3 <6, пользователь сначала вводит 6, а затем 3.), программа должна отобразить сообщение об ошибке и попросить пользователя ввести снова номера Я получил его до тех пор, пока я не выведу сообщение об ошибке, но не могу понять, как снова получить данные. Вот мой код. _ </p>

.data
error: .asciiz "Error: first must be <= last. Try again please."
new: .asciiz "\n"
tab: .asciiz "\t"
first: .asciiz "Enter two integers for first and last please: \n"
str1: .asciiz "first="
str2: .asciiz "last="
result: .asciiz "The sum = "

.text
.globl driver

driver:
    la  $a0,first
    li  $v0,4
    syscall

    la  $a0,str1
    li  $v0,4
    syscall

    li  $v0,5
    syscall

    move     $t0,$v0

    la  $a0,str2
    li  $v0,4
    syscall

    li   $v0,5
    syscall

    move    $t1,$v0

    ble     $t1,$t0, done 

    move     $a1,$t1
    move    $a0,$t0 

    addiu   $sp, $sp, -8
    sw  $a0, 0($sp)
    sw  $a1, 4($sp)
    jal     f2l

    lw  $a0, 0($sp)
    lw  $a1, 4($sp)
    addiu   $sp, $sp, 8

    move    $t5,$a0
    move    $t6,$a1
    move    $t7,$v0

    la  $a0,new
    li   $v0,4
    syscall

    la   $a0,str1
    li  $v0,4
    syscall

    move     $a0,$t5
    li   $v0,1
    syscall

    la   $a0,tab
    li  $v0,4
    syscall

    la   $a0,str2
    li  $v0,4
    syscall

    move     $a0,$t6
    li   $v0,1
    syscall

    la  $a0,new
    li   $v0,4
    syscall

    la   $a0,result
    li  $v0,4
    syscall

    move     $a0,$t7
    li  $v0,1
    syscall

    la  $a0,tab
    li  $v0,4
    syscall


    li  $v0,10
    syscall


done:   la   $a0,error
    li  $v0,4
    syscall 

    li  $v0,10
    syscall


f2l:    lw   $t2,0($sp)
    lw  $t3,4($sp)

loop:   beq  $t2,$t3,exit
    add  $v0,$v0,$t2
    addi     $t2,$t2,1
    j loop  

exit:   jr $ra

1 Ответ

0 голосов
/ 14 апреля 2020

Я понял, просто замените готовую часть следующим кодом, и это работает. оставив это здесь, если кому-то нужна помощь.

done:
    la   $a0,error
    li  $v0,4
    syscall 

    j driver
...