2015-09-12 4 views
0

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

В моем следующем коде я устанавливаю $ 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 

ответ

0

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

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

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

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

Спасибо!

Редактировать: некоторые пунктуации.

Смежные вопросы