ASM MIPS - Подсчет: получение неправильных значений - PullRequest
0 голосов
/ 20 марта 2019

Я работаю с 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."

1 Ответ

0 голосов
/ 20 марта 2019
addi $k0,$k0,8 # Add 4 to point to next instruction

это был фактически оставшийся отладочный код

addi $k0,$k0,4 # Add 4 to point to next instruction

было решением.

...