#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
inaddition
и др., вероятно, завершат программу, посколькуbeq
не обновляются$ra
.