Я работаю с Mars 4.5, ASM и хочу создать калькулятор тригонометрии с пользовательским вводом.
Я хочу посчитать, сколько (из заданных) значений введено пользователем. Скрипт должен распечатать количество сторон и углов, которые были введены (и которые не были просто подтверждены нажатием «Enter»).
Если я введу все значения, результат будет правильным. Если я пропущу один, результат для обоих счетчиков равен 0.
Если я удаляю альфа / бета / гамма-код, работает боковой счетчик, когда я пропускаю определенные значения. Когда я отлаживаю это, похоже ли это, что это приводит к бесконечному циклу между
li $t8, 1
и
eret
Может кто-нибудь может сказать мне, почему?
.data
printGetA: .asciiz "Enter a: "
printGetB: .asciiz "\nEnter b: "
printGetC: .asciiz "\nEnter c: "
printGetAlpha: .asciiz "\nEnter alpha: "
printGetBeta: .asciiz "\nEnter beta: "
printGetGamma: .asciiz "\nEnter gamma: "
ResultStr: .asciiz "\nResult: "
SidesStr: .asciiz "\nSides Given: "
AnglesStr: .asciiz "\nAngles Given: "
.text
.globl main
main:
li $t8, 0 # Flag that tells if the user entered something
li $t7, 3 # Side Counter
li $t9, 3 # Angle Counter
la $a0, printGetA # Print Input Message A
li $v0, 4 # Call API StdOut
syscall
li $v0, 7 # Call API StdIn
syscall
mov.d $f4, $f0 # Move a to Register f4
beqz $t8, AOK # if not trapped (if the user entered a float) -> AOK
li $t1, 1 # Flag a not given
addiu $t7, $t7, -1 # Reduce side counter
l.d $f4, 0 # Set a = 0
AOK:
li $t8, 0 # Re-toggle input flag
la $a0, printGetB
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f6, $f0 # Move b to Register f6
beqz $t8, BOK
li $t2, 1
addiu $t7, $t7, -1
l.d $f6, 0
BOK:
li $t8, 0
la $a0, printGetC
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f8, $f0 # Move c to Register f8
beqz $t8, COK
li $t3, 1
addiu $t7, $t7, -1
l.d $f8, 0
COK:
li $t8, 0
la $a0, printGetAlpha
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f10, $f0 # Move alpha to Register f10
beqz $t8, AlphaOK
li $t4, 1 # Flag alpha not given
addiu $t9, $t9, -1 # Decrease angle counter
l.d $f10, 0
AlphaOK:
li $t8, 0
la $a0, printGetBeta
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f16, $f0 # Move beta to Register f16
beqz $t8, BetaOK
li $t5, 1 # Flag beta not given
addiu $t9, $t9, -1
l.d $f16, 0
BetaOK:
li $t8, 0
la $a0, printGetGamma
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f20, $f0 # Move gamma to Register f20
beqz $t8, GammaOK
li $t5, 1 # Flag gamma not given
addiu $t9, $t9, -1
l.d $f20, 0
GammaOK:
li $t8, 0
####### check if input is sufficient######
la $a0, SidesStr
li $v0, 4 # Call API StdOut
syscall
move $a0, $t7 # Print sides count
li $v0, 1 # Call API StdOut Int
syscall
la $a0, AnglesStr
li $v0, 4 # Call API StdOut
syscall
move $a0, $t9 # Print angles count
li $v0, 1 # Call API StdOut Int
syscall
li $v0, 10
syscall # End of program
.ktext 0x80000180
move $k0,$v0 # Save $v0 value
move $k1,$a0 # Save $a0 value
#la $a0, msg # address of string to print
#li $v0, 4 # Print String service
#syscall
move $v0,$k0 # Restore $v0
move $a0,$k1 # Restore $a0
mfc0 $k0,$14 # Coprocessor 0 register $14 has address of trapping instruction
addi $k0,$k0,8 # Add 4 to point to next instruction
mtc0 $k0,$14 # Store new address back into $14
li $t8, 1
eret # Error return; set PC to value in $14
.kdata
msg:
.asciiz "An error occured."