奇怪的MIPS地址行为

奇怪的MIPS地址行为,mips,Mips,我是MIPS的新手,还在抓取一些基本命令,目前我遇到了一个非常奇怪的情况,我有两个相同的代码,但一个运行,另一个不运行 这是在第sw$v0行输入时引发异常的代码: .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, inp

我是MIPS的新手,还在抓取一些基本命令,目前我遇到了一个非常奇怪的情况,我有两个相同的代码,但一个运行,另一个不运行

这是在第
sw$v0行输入时引发异常的代码:

.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
我看不出这两种语言之间有什么区别,或者这门语言有什么我不知道的吗


顺便说一句,我使用Mars4.5和JDK13。非常感谢。

如果您正在编写任何MIPS程序集,您应该获得官方指令集参考(MIPS32)™ 程序员体系结构 第二卷:MIPS32™ 指令集)

对于
sw
指令,其说明如下:

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

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

第二个示例恰好是出于运气,因为您的两个字符串占用了24字节的内存,因此
input
标签从
.data
部分的开头算起24字节,这是一个单词对齐的地址

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

.align 2
input: .word 0

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

您会得到什么错误?它说在0x0040001c出现
运行时异常:存储地址未在字边界0x10010011对齐