MIPS: строка калькулятора не выполняется с помощью syscall;Подсказка 1 не печатается после одного расчета - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над калькулятором в MIPS, который может поддерживать длинные целые числа.Вычисления заканчиваются хорошо, однако, когда я пытаюсь напечатать результат, системный вызов для печати строки фактически ничего не печатает.Результат заканчивается печатью после того, как система зацикливается, и выполняется системный вызов для первого запроса.Когда я отлаживаю его и иду шаг за шагом, это показывает, что система доходит до строки исполнения, однако после ее выполнения ничего не происходит.

У меня возникли некоторые проблемы с определением причинЭто.Я думаю, что это связано с моей процедурой getInput, где я читаю строку.

Вот процедуры, которые, я думаю, могут быть проблемой.

#Procedure:  GetInput
#Displays a prompt to the user and then wait for a numerical input
#The users input will get stored to the (word) address pointed by $a1
#Input: $a0 points to the text string that will get displayed to the user
#Input: $a1 points to a word address in .data memory, where to store the input number
getInput:
    #PRINT STRING
    li      $v0, 4              #Load print string syscall
    syscall                    #Execute

    #READ INPUT
    move        $t0, $a1         #Save pointer
    li          $v0, 8          #Load read string input
    li          $a1, 80
    syscall                    #Execute
    move        $a1, $t0         #Reload pointer

    #SAVE RETURN TO STACK
    addi $sp, $sp, -4            #Subtract 4 to stack to prevent loss of memory
    sw $ra, 0($sp)               #Saves #ra on stack

    #CONVERT
    jal     DecAscToBin        #Jump to convert ascii to binary

    #LOAD RETURN FROM STACK
    lw $ra, 0($sp)               #Loads $ra on stack
    addi $sp, $sp, 4             #Add 4 to stack to prevent loss of memory

    jr      $ra             #Return

DisplayNumb:

#Procedure: DisplayNumb
#Displays a message to the user followed by a numerical value
#Input: $a0 points to the text string that will get displayed to the user
#Input: $a1 points to a word address in .data memory, where the result value is stored
displayNumb:
    #PRINT STRING
    li      $v0, 4              #Load print string syscall
    syscall                     #Execute

    #SAVE RETURN TO STACK
    addi $sp, $sp, -4               #Subtract 4 to stack to prevent loss of memory
    sw $ra, 0($sp)                  #Saves #ra on stack

    #CONVERT RESULT BINARY
    move        $a0, $a1            #Load pointer of result to be converted in $a0
    la      $a1, buffer         #Load pointer of result buffer for holding string to be printed in $a1
    jal     BinToDecAsc         #Convert

    #LOAD RETURN FROM STACK
    lw $ra, 0($sp)                  #Loads $ra on stack
    addi $sp, $sp, 4                #Add 4 to stack to prevent loss of memory

    #PRINT RESULT
    la      $a0, buffer             #Copy result into $a0
    li      $v0, 4              #Load print string syscall
    syscall                     #Execute <-- RUNS BUT NOTHING PRINTS

    jr      $ra             #Return

enter image description here

Этой информации может быть недостаточно для самостоятельного решения проблемы.Вы можете взять весь проект с моей страницы Github здесь .Проект находится в mipscalc.asm.

1 Ответ

0 голосов
/ 09 октября 2018

Я понял это.Проблема в том, что я использовал строку для приглашения 1, чтобы прочитать строку от пользователя.Если вместо этого я использую новую строку буфера для чтения во входных данных, это решает проблему.

#READ INPUT
    move        $t0, $a1         #Save pointer
    la          $a0, buffer      #LOAD BUFFER STRING INSTEAD OF PROMPT STRING
    li          $v0, 8           #Load read string input
    li          $a1, 80
    syscall                      #Execute
    move        $a1, $t0         #Reload pointer
...