Много проблем в вашем коде.
la $a0, ($t0)
неверно.Ассемблер должен предупредить вас.la
- это макрос из двух инструкций, который загружает адрес из метки, а $ t0 - это регистр (который уже содержит значение str1).
Его следует заменить на la $a0, str1
или (значительнолучше, потому что это уникальная инструкция) mov $a0, $t1
, как вы уже сделали это вычисление для $ t1.У вас та же проблема для str2, str3 и str4.Но нет необходимости использовать временный регистр, и вы можете напрямую выполнить вычисления в $ a0.
Есть еще одна проблема.Согласно документации после syscall
5 "$ v0 содержит целочисленное чтение".Так что sw $s0, ($v0)
после прочтения недействительных значений.То, что должно быть сохранено, - $v0
, а адрес хранилища - num1, и он уже был загружен в $ s0.
add $s2, $s1, $s0
также неверен, поскольку значения $ s0 и $ s1 являются целочисленными адресами, а не целочисленными значениями..
Наконец, вы не можете печатать сразу строку и целое число.Это должно быть сделано в двух системных вызовах: системный вызов 4 для печати строки и системный вызов 1 для печати целого числа.
.data
str1: .asciiz "Enter number 1: "
str2: .asciiz "Enter number 2: "
str3: .asciiz "The sum of the two number is: "
str4: .asciiz "The difference of the two number is: "
num1: .word 4
num2: .word 4
.text
.globl main
main:
la $a0, str1
li $v0, 4 #syscall code for print_str
syscall #print str1
li $v0, 5 #syscall code for read int
syscall #read int
mov $s0, $v0 ## keep the value of int in a register
la $t1, num2
sw $v0, ($t1) #store the entered value in num2
li $v0, 4 #syscall for print_str
la $a0, str2 #address of string to print
syscall #print str2
li $v0, 5 #syscall code for read int
syscall #read int
mov $s1, $v0 ## keep the value of int in a register
la $t1, num2
sw $v0, ($t1) #store the entered value in num2
add $s2, $s0, $s1 #add num1 and num2
la $a0, str3
li $v0, 4 #syscall for print_str
syscall #print str3
li $v0, 1 #syscall for print integer
mov $a0, $s2 #value of the sum
syscall #print sum
sub $s3, $t0, $t1 #substract num1 and num2
la $a0, str4
li $v0, 4 #syscall for print_str
syscall #print str4
li $v0, 1 #syscall for print integer
mov $a0, $s3 #value of the diff
syscall #print diff value
Кстати, хранение целых чисел бесполезно.Я сохранил их, потому что они есть в названии вопроса, но если вам нужны только сумма и различие, инструкции sw
и соответствующие la
могут быть исключены.