/ / beq príkaz nie je skákanie na štítok v MIPS - príkaz, mips, mars-simulátor

príkaz beq neskočí na štítok v MIPS - príkaz, mips, mars-simulátor

Vytváram MIPS kód v MARS, ktorý umožňuje len vstup číselného výrazu a vytlačiť chybové hlásenie, ak sú prítomné iné znaky ako čísla, +, -, * a / alebo.

V nasledujúcom kóde som nastavil hodnotu $ s0 na nulu, ak tam bolaje neplatný znak, inak zostane na 1. Ak sa rovná nule, pomocou príkazu beq by som skočil na "chybné", ktoré spracováva chybové hlásenie.

Zdá sa však, že táto posledná časť sa nestane. Ak spustíte môj kód, uvidíte, že skutočne získa správne hodnoty $ s0 right (to znamená, že ak je výraz neplatný, stane sa rovným 0).

Potrebujem novú sadu očí, ocenil by som akúkoľvek pomoc. Vďaka!

.data
input: .space 102
trial: .asciiz "LOLLOLn"
errormsg: .asciiz "ERRORn"
.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

odpovede:

0 pre odpoveď č. 1

Pre každého, kto sa môže stretnúť s touto otázkou, som si mohol vyriešiť svoj vlastný problém, ale nie som si istý, či je to naozaj oprava, alebo "podvádzanie". Je to viac práce okolo.

Presunul som riadok „beq $ s0, $ nula, chybný“ na menovku „povolené:“. Neviem, prečo nefunguje zvnútra check_valid_char, ale funguje to.

Potom vnútri chybne, som reset $ s0 na 0 pomocou "sub $ s0, $ s0, $ s0" tak, že keď kód ide znova na povolené:, beq bude len preskočiť a to skončí normálne.

Ak iní môžu nájsť "skutočné" riešenie môjho problému, pošlite ho.

Vďaka!

upraviť: niektoré interpunkcie.