Assembly Mips.space指令内存地址超出范围

Assembly Mips.space指令内存地址超出范围,assembly,mips,Assembly,Mips,我的代码如下所示: .data .space 40 prompt: .asciiz "Please enter a number:" .text main: lui $a0, 0x1029 # accessing address(prompt) after 40 bytes (41th byte) addi $v0, $0, 4 syscall 通过运行上面的代码,我得到了一个内存地址越界错误,并且“null”被打印到控制台。我不明白为什么会发生这种错误 另一方面,如果我将主标签中的第一行替

我的代码如下所示:

.data
.space 40
prompt: .asciiz "Please enter a number:"
.text

main:
lui $a0, 0x1029 # accessing address(prompt) after 40 bytes (41th byte)
addi $v0, $0, 4
syscall
通过运行上面的代码,我得到了一个内存地址越界错误,并且“null”被打印到控制台。我不明白为什么会发生这种错误

另一方面,如果我将主标签中的第一行替换为以下两行:

lui $a0, 0x1000
addi $a0, $a0, 40

然后它工作正常。

lui$a0,0x1029
$a0
设置为
0x10290000
,立即左移16。这就是
lui
的全部要点,加载上限立即数

lui$a0,0x1000
/
addi$a0,$a0,40
$a0
设置为
0x10000028
,这是
提示符的地址

这是
la$a0,prompt
将汇编到的内容


除了把0x29放错位置之外,它是0x28。请记住,起始地址是0,因此.data部分的第41个字节有偏移量40


数据段的第一个字节的偏移量为0。

Doing
lui$a0,0x1029
将产生地址
0x10290000
而不是
0x10000029
,因为它设置了高16位。因此得名:LoadUpper immediate。参考指令集参考。PS:除非你真的确定你的地址,否则你应该使用
la
。所以我不能用洛杉矶,这很有意义。谢谢