我的代码如下所示:
.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
,即prompt
的地址。
这就是la $a0, prompt
会组装的东西。
除了把0x29放在错误的地方之外,它0x28。 请记住,起始地址为 0,因此 .data 部分的第 41 个字节的偏移量为 40。
数据部分的第一个字节的偏移量为 0。