我是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
开始:执行由于错误而终止。
答案 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
就可以被取消。