我是MIPS的新手,但仍在抓一些基本命令,目前我遇到了一种非常奇怪的情况,我有2个相同的代码,但有一个运行,而另一个则没有。
这是在第sw $v0, input
行运行时引发异常的代码:
.data
Text_output1: .asciiz "Input number 1: "
input: .word
.text
main:
li $v0, 4
la $a0, Text_output1
syscall
li $v0, 5
syscall
sw $v0, input
li $v0, 1
lw $a0, input
add $a0, $a0, 1
syscall
这是正常的功能:
# Program: Hello, World!
.data
# data declaration section; specifies values to be stored
# in memory and labels whereby the values are accessed
Greeting: .asciiz "\nghfhgfhgf\n"
Text_output1: .asciiz "Number 1 : "
input: .word
.text # Start of code section
main: # Execution begins at label "main"
li $v0, 4 #in ra number 1 :
la $a0, Text_output1
syscall
li $v0, 5
syscall
sw $v0, input
li $v0, 1
lw $a0, input
add $a0, $a0, 1
syscall
我看不出两者之间的任何区别,还是我对这种语言不了解?
Btw im在JDK 13上使用MARS 4.5。非常感谢。
答案 0 :(得分:1)
如果要编写任何MIPS程序集,则应获取正式的指令集参考(面向程序员的MIPS32™体系结构 第二卷:MIPS32™指令集)。
对于sw
指令,它指出以下内容:
限制:
有效地址必须自然对齐。如果地址的2个最低有效位中的任何一个都不为零,则 地址错误发生异常。
正如模拟器明确指出的那样,您在地址sw
上有一条0x0040001c
指令,试图写入地址0x10010011
(不是字对齐的地址)。
您的第二个示例碰巧由于纯粹的运气而工作,因为您的两个字符串占用了24个字节的内存,因此input
标签从.data
节的开头开始是24个字节,即字对齐地址。
为确保正确对齐,请使用.align
指令,例如:
.align 2
input: .word 0
还要注意0
之后的.word
。如果您忽略初始值而只写.word
,则添加更多变量会遇到问题(它们都将获得相同的地址)。