Калькулятор сборки MIPS

#assembly #mips

#сборка #mips

Вопрос:

Привет, пожалуйста, простите меня, если мой пост не соответствует стандартам StackOverflow, поскольку я новичок. Я пытаюсь создать калькулятор на языке ассемблера MIPS. Моя проблема в том, что после того, как я ввожу свои целочисленные значения при запуске программы, ответ просто выводится в виде адреса. Мысли о том, почему я не могу получить значение для печати?

Вот мой код:

 .data
getnum1: .asciiz "Enter your first number: "
getnum2: .asciiz "Enter your second number: "
getoperator: .asciiz "What type of calculation? (0 - add, 1 - subtract, 2 - multiply): "
result: .asciiz "The result is: "
num1: .word 1       #int 1
num2: .word 1       #int 2
operator: .word 1   #operator
answer: .word 1     #result

.text

main:   
li $v0, 4       #print string
la $a0, getnum1 #"Enter your first number: "
syscall

li $v0, 5       #read int
syscall         
la $s1, num1    #load num1 into s1
sw $v0, num1        #store value into s1 (num1) 

li $v0, 4       #print string
la $a0, getnum2 #"Enter your second number: "
syscall

li $v0, 5       #read int
syscall
la $s2, num2    #load num2 into s2
sw $v0, num2    #store value into s2 (num2)

li $v0, 4       #print string
la $a0, getoperator #"What type of calculation?..."
syscall

li $v0, 5       #read int
syscall
la $s3, operator #load operator into s3
sw $v0, operator #store value into s3 (operator)

la $s0, answer

beq $s3, 0, addition    #if operator is == 0, jump to addition
beq $s3, 1, subtract    #if operator is == 1, jump to subtract
beq $s3, 2, multiply    #if operator is == 2, jump to multiply

li $v0, 4       #print string
la $a0, result  #"The result is: "
syscall

li $v0, 1       #print int
la $a0, answer
syscall

addition:
add $s0, $s1, $s2  #add s1 and s2, store in s0
jr $ra  #return to last spot
subtract:
sub $s0, $s1, $s2  #subtract s1 and s2, store in s0
jr $ra  #return to last spot
multiply:
mult $s1, $s2 #multiply s1 and s2, store in s0
mflo $s0
jr $ra  #return to last spot
  

Комментарии:

1. Вы используете la для ввода адреса, a0 когда системный вызов 1 ожидает a0 , что он будет содержать фактическое значение.

2. Но прежде чем я перейду в beq, я сохраняю адрес ответа в s0, затем в каждой метке ветки я сохраняю результат в s0, так как же мне заставить его выполнять значение? Когда я пытаюсь: la $ a0, $ s0, это выдает ошибку

3. Я бы предположил, что вы, вероятно, хотите lw $a0, answer , а не la . Потому что, опять же, вы не хотите, чтобы адрес сохранялся в a0

4. Я изменил его на sw $ s0, отвечал сразу после инструкций beq, затем изменил его на lw $ a0, отвечал прямо перед системным вызовом в конце. Теперь я просто получаю ответ 0 каждый раз

5. Ну, я не уверен, что la $s1, num1 la $s2, num2 и la $s3, operator должны делать, но они кажутся неправильными. Кроме того, jr $ra in addition и др., вероятно, завершат программу, поскольку beq не обновляются $ra .