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