Попросить пользователя ввести два числа, сохранить их в памяти, выполнить сложение и вычитание и отобразить оба результата. - PullRequest
0 голосов
/ 28 мая 2019

Я новичок в MIPS, и я работаю над этим вопросом, мой код будет собираться, но после нажатия кнопки запуска и ввода первого числа будет отображаться исключение времени выполнения: исключение времени выполнения при 0x00400018: адресвне диапазона 0x00000000

Я не понимаю, что происходит с моим кодом, кто-нибудь может мне помочь?

    .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  $t0, str1

li  $v0, 4      #syscall code for print_str

la  $a0, ($t0)  #address of string to print

syscall         #print str1

la  $s0, num1

li  $v0, 5      #syscall code for read int 

syscall         #read int

sw  $s0, ($v0)  #store the enterd value in num1

    la  $t1, str2
    li  $v0, 4      #syscall for print_str
    la  $a0, ($t1)      #address of string to print
    syscall         #print str2
    la  $s1, num2
    li  $v0, 5      #syscall code for read int
    syscall         #read int
    sw  $s1, ($v0)  #store the entered value in num2

    add $s2, $s0, $s1   #add num1 and num2

    la  $t2, str3
    li  $v0, 4      #syscall for print_str
    la  $a0, ($t2)      #address of str3
    la  $a1, ($s2)      #address of the sum
    syscall         #print str3 and the sum

    sub $s3, $s0, $s1   #substract num1 and num2    ERROR COULD BE HERE

    la  $t3, str4
    li  $v0, 4      #syscall for print_str
    la  $a0, ($t3)      #address of str4
    la  $a1, ($s3)      #address of the difference
    syscall         #print str4 and the difference
    li  $v0, 10     #exit
    syscall

Ошибка в строке C: \ Users \ Desktop \ exerc2.s 18:Исключительная ситуация при 0x00400018: адрес вне диапазона 0x00000000

Go: выполнение прекращено с ошибками.

1 Ответ

0 голосов
/ 28 мая 2019

Много проблем в вашем коде.

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 могут быть исключены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...