奇怪的MIPS地址行为

时间:2019-10-03 05:55:19

标签: mips

我是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。非常感谢。

1 个答案:

答案 0 :(得分:1)

如果要编写任何MIPS程序集,则应获取正式的指令集参考(面向程序员的MIPS32™体系结构 第二卷:MIPS32™指令集)。

对于sw指令,它指出以下内容:

  

限制:
  有效地址必须自然对齐。如果地址的2个最低有效位中的任何一个都不为零,则   地址错误发生异常。

正如模拟器明确指出的那样,您在地址sw上有一条0x0040001c指令,试图写入地址0x10010011(不是字对齐的地址)。

您的第二个示例碰巧由于纯粹的运气而工作,因为您的两个字符串占用了24个字节的内存,因此input标签从.data节的开头开始是24个字节,即字对齐地址。

为确保正确对齐,请使用.align指令,例如:

.align 2
input: .word 0

还要注意0之后的.word。如果您忽略初始值而只写.word,则添加更多变量会遇到问题(它们都将获得相同的地址)。