Работа с несколькими условиями в MIPS - PullRequest
0 голосов
/ 22 ноября 2018

Я делаю MIPS-программу, которая читает и решает головоломки какуро.На данный момент он может прочитать и распечатать головоломку, но у меня возникли некоторые проблемы с добавлением проверки ошибок.Мне нужно сделать много проверок, и по какой-то причине программа не завершается так, как должна.Если входные данные содержат недопустимое значение (допустимые значения: 0, или отдельные подсказки в диапазоне 1-45, или отдельную подсказку «блока», равную 99), тогда ваша программа должна распечатать следующее сообщение об ошибке иПрограмма должна завершиться.Некоторые примеры легального ввода:

9999 blocking across and down clues
0799 across clue of 7, blocking down clue
9942 blocking across clue, down clue of 42
1208 across clue of 12, down clue of 8

Итак, вот что я придумал в C:

acrossClue = num / 100;
downClue = num % 100;
if(num != 0 && (1 > acrossClue || 45 < acrossClue || acrossClue != 99) 
|| (1 > downClue || 45 < downClue || downClue != 99)) {
    printf("Illegal input value, Cross sums terminating\n");
    return 1;
}

Ниже приведен код для main и функции чтения, которые я сделал.Любые предложения по передаче условных обозначений и логики в MIPS?В настоящее время он не работает, потому что, даже если он получает неправильный ввод, он все равно работает (readPuzzle возвращает 1, несмотря на преждевременное завершение), и он испортил головоломку, даже если ввод правильный.Я думал, что если входные данные не являются какими-либо из проверенных значений, они не могут быть действительными, но я предполагаю, что где-то в строке я не проверяю должным образом, и все портит.Кто-нибудь замечает что-то не так с какой-либо проверкой, которую я делаю в readPuzzle?

#
# Name:         MAIN PROGRAM
# Description:  Main logic for the program.
#
#               The program reads these values from standard input:
#               1) an integer representing the size of the puzzle
#               2) integers representing values for each cell for the puzzle
#
#               If the dimensions of the board and values of the cells are
#               valid, the program then displays the initial puzzle, attempts
#               to solve it, and displays the solution if there is one.

    .text                           # this is program code
    .align 2                        # instructions must be on word boundaries
    .globl main                     # main is a global label

main:

    # Allocate stack frame

    addi    $sp, $sp,-FRAMESIZE_40
    sw      $ra, 32($sp)
    sw      $s7, 28($sp)
    sw      $s6, 24($sp)
    sw      $s5, 20($sp)
    sw      $s4, 16($sp)
    sw      $s3, 12($sp)
    sw      $s2, 8($sp)
    sw      $s1, 4($sp)
    sw      $s0, 0($sp)

    la      $t0, size

    li      $v0, READ_INT
    syscall
    move    $s0, $v0            # save size n

    blt     $s0, MIN_SIZE, size_error
    bgt     $s0, MAX_SIZE, size_error

    sw      $v0, 0($t0)

    move    $a0, $s0
    jal     readPuzzle

    move    $t7, $v0

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

    beq     $v0, $zero, main_done

    la      $s1, puzzle

    li      $v0, PRINT_STRING
    la      $a0, newline
    syscall

    li      $v0, PRINT_STRING
    la      $a0, banner_border
    syscall

    li      $v0, PRINT_STRING
    la      $a0, banner_mid
    syscall

    li      $v0, PRINT_STRING
    la      $a0, banner_border
    syscall

    li      $v0, PRINT_STRING
    la      $a0, newline
    syscall

    li      $v0, PRINT_STRING
    la      $a0, initial
    syscall

    move    $a0, $s0
    move    $a1, $s1
    jal     printPuzzle

    li      $v0, PRINT_STRING
    la      $a0, final
    syscall

    move    $a0, $s0
    move    $a1, $s1
    jal     printPuzzle

    j       main_done

size_error:

    li      $v0, PRINT_STRING
    la      $a0, invalid_size
    syscall

    j       main_done

main_done:

    # Restore stack frame

    lw      $ra, 32($sp)
    lw      $s7, 28($sp)
    lw      $s6, 24($sp)
    lw      $s5, 20($sp)
    lw      $s4, 16($sp)
    lw      $s3, 12($sp)
    lw      $s2, 8($sp)
    lw      $s1, 4($sp)
    lw      $s0, 0($sp)
    addi    $sp, $sp, FRAMESIZE_40
    jr      $ra

# Name:         readPuzzle
#
# Description:  Reads in the puzzle from a file or stdin.
#
# Arguments:    a0      The size n
#
# Returns:      1 if the read was successful, otherwise 0
#

readPuzzle:

    addi    $sp, $sp, -FRAMESIZE_40
    sw      $ra, 32($sp)
    sw      $s7, 28($sp)
    sw      $s6, 24($sp)
    sw      $s5, 20($sp)
    sw      $s4, 16($sp)
    sw      $s3, 12($sp)
    sw      $s2, 8($sp)
    sw      $s1, 4($sp)
    sw      $s0, 0($sp)

    move    $s0, $a0

    mul     $s1, $s0, $s0       # get n * n
    li      $s2, 0
    la      $s3, puzzle
    li      $s4, 4
    li      $s5, 0              # row = 0
    li      $s6, 0              # col = 0
    mul     $s1, $s1, $s4       # get (n * n) * 4 bytes
    li      $t1, 100

    j       read_loop

read_loop:

    beq     $s2, $s1, read_done

    beq     $s5, $s1, reset

    li      $v0, READ_INT
    syscall
    move    $s7, $v0

    beq     $s7, $zero, continue

    div     $s7, $t1

    mflo    $t2                 # acrossClue = num / 100
    mfhi    $t3                 # downClue = num % 100

    seq     $t4, $t2, Block_Value
    seq     $t5, $t3, Block_Value

    seq     $t6, $t4, $t5
    bne     $t6, $zero, continue

    li      $t6, MIN_CLUE   # minimum value = 2
    li      $t7, MAX_CLUE   # maximum value = 45

    slt     $t4, $t2, $t6       # 1 if acrossClue < 2, otherwise 0
    slt     $t5, $t7, $t2       # 1 if acrossClue > 45, otherwise 0
    bne     $t4, $zero, illegal_input
    bne     $t5, $zero, illegal_input

    slt     $t4, $t3, $t6       # 1 if downClue < 2, otherwise 0
    slt     $t5, $t7, $t3       # 1 if downClue > 45, otherwise 0
    bne     $t4, $zero, illegal_input
    bne     $t5, $zero, illegal_input

    j       continue

continue:

    move    $a0, $s5
    move    $a1, $s6
    move    $a2, $s7
    jal     setElement

    addi    $s6, $s6, 1
    addi    $s2, $s2, 4
    j       read_loop

reset:

    addi    $s5, $s5, 1
    li      $s6, 0

illegal_input:

    li      $v0, PRINT_STRING
    la      $a0, invalid_input
    syscall

    li      $v0, 0

    j       read_done

read_done:

    li      $v0, 1

    lw      $ra, 32($sp)
    lw      $s7, 28($sp)
    lw      $s6, 24($sp)
    lw      $s5, 20($sp)
    lw      $s4, 16($sp)
    lw      $s3, 12($sp)
    lw      $s2, 8($sp)
    lw      $s1, 4($sp)
    lw      $s0, 0($sp)
    addi    $sp, $sp, FRAMESIZE_40
    jr      $ra

Редактировать: я получил его, чтобы он правильно знал, когда ввод действителен или недействителен, но он все еще не завершается, когдаесть неверное входное значение.

...