команда beq не переходит на метку в MIPS

Я создаю код MIPS в MARS, который позволяет вводить только числовое выражение и выводить сообщение об ошибке, когда присутствуют символы, отличные от цифр, +, -, * и /.

В моем следующем коде я устанавливаю $s0 равным нулю, если есть недопустимый символ, в противном случае он остается равным 1. Если он равен нулю, с помощью команды beq я бы перешел к «ошибочному», который обрабатывает сообщение об ошибке.

Однако эта последняя часть, похоже, не происходит. Если вы запустите мой код, вы увидите, что он на самом деле получает правильные значения $s0 (то есть, если выражение неверно, оно становится равным 0).

Мне нужен свежий взгляд, буду признателен за любую помощь. Спасибо!

.data 
input: .space 102
trial: .asciiz "LOLLOL\n"
errormsg: .asciiz "ERROR\n"
.text

main:
addi $v0, $zero, 8
la $a0, input
addi $a1, $a0, 102
syscall
addi $t1 , $zero, 0
add $s1, $zero, $zero
addi $a0, $zero, -1
addi $s0, $zero,1

check_invalid_char_1:
#beq $s0, $s1, erroneous
jal check_invalid_char
j allowed

check_invalid_char:
addi $sp,$sp,-8
sw $ra, 0($sp)
sw $a0, 4($sp)
#sw $v0, 8($sp)

addi $a0, $a0,1
addi $t3, $zero,0
beq $s0, $zero, erroneous

lb $t2, input($a0)
beq $t2, 48, check_invalid_char_1   #pwede 0
beq $t2, 49, check_invalid_char_1   #pwede 1
beq $t2, 50, check_invalid_char_1   #pwede 2
beq $t2, 51, check_invalid_char_1   #pwede 3
beq $t2, 52, check_invalid_char_1   #pwede 4
beq $t2, 53, check_invalid_char_1       #pwede 5
beq $t2, 54, check_invalid_char_1       #pwede 6
beq $t2, 55, check_invalid_char_1   #pwede 7
beq $t2, 56, check_invalid_char_1       #pwede 8
beq $t2, 57, check_invalid_char_1   #pwede 9
beq $t2, 43, check_invalid_char_1   #pwede +
beq $t2, 45, check_invalid_char_1   #pwede -
beq $t2, 42, check_invalid_char_1   #pwede *
beq $t2, 47, check_invalid_char_1   #pwede /
beq $t2, 0, allowed             #pwede null terminator
beq $t2, 10, allowed            #pwede newline


add $s0, $zero,$zero

lw $ra, 0($sp)
lw $a0, 4($sp)
#lw $v0, 8($sp)
addi $sp, $sp, 8

jr $ra


erroneous:
#add $a0, $zero, $zero
la $a0, errormsg
addi $v0, $zero, 4
syscall


allowed:
addi $v0, $zero, 1
add $a0, $s0, $zero
syscall
#la $a0, errormsg
#addi $v0, $zero, 4
#syscall
addi $v0, $zero, 10
syscall 

person kierkegaard14    schedule 12.09.2015    source источник


Ответы (1)


Всем, кто может столкнуться с этим вопросом, я, возможно, решил свою проблему, но я не уверен, действительно ли это исправление или «обман». На самом деле это больше похоже на работу.

Я переместил строку «beq $s0, $zero, ошибочно» на метку «разрешено:». Я не знаю, почему это не работает изнутри check_valid_char, но это работает.

Затем внутри ошибочно я сбрасываю $s0 на 0, используя «sub $s0, $s0, $s0», так что, когда код снова переходит к allow: , beq будет просто пропущен, и он завершится нормально.

Если другие могут найти «реальное» решение моей проблемы, опубликуйте это.

Спасибо!

редактировать: некоторые знаки препинания.

person kierkegaard14    schedule 12.09.2015