奇怪的MIPS地址行为
我是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
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对齐