要求用户输入两个数字,将它们存储在内存中,进行加减运算并显示两个结果

时间:2019-05-28 03:48:44

标签: mips

我是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 \ exercise2.s中的错误行18:运行时异常位于0x00400018:地址超出范围0x00000000

开始:执行由于错误而终止。

1 个答案:

答案 0 :(得分:0)

您的代码中有很多问题。

la $a0, ($t0)不正确。汇编程序应警告您。 la是两个指令宏,它从标签加载地址,而$ t0是寄存器(已保存str1的值)。

应将其替换为la $a0, str1或(因为它是唯一指令,所以更好(因为它是唯一的指令)mov $a0, $t1,因为您已经为$ t1进行了此计算。对于str2,str3和str4,您有相同的问题。 但是不需要使用临时寄存器,您可以直接在$ a0中进行计算。

还有另一个问题。根据{{​​1}} 5之后的documentation,“ $ v0包含整数读取”。因此,读取整数后的syscall不正确。应该存储的是sw $s0, ($v0),存储地址为num1,并且已经加载到$ s0中。

$v0也不正确,因为$ s0和$ s1值是整数地址,而不是整数值。

最后,您不能一次打印字符串和整数。必须在两个syscall中完成:syscall 4打印一个字符串,syscall 1打印整数。

add $s2, $s1, $s0

顺便说一句,存储整数是没有用的。我保留它们是因为它位于问题的标题中,但是您只需要求和与求和, .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就可以被取消。