我的代码如下:
.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
然后正常工作。
答案 0 :(得分:0)
lui $a0, 0x1029
将$a0
设置为0x10290000
,立即数左移16。这就是lui
的全部点,立即加载 upper
lui $a0, 0x1000
/ addi $a0, $a0, 40
将$a0
设置为0x10000028
的地址prompt
。
这是la $a0, prompt
所要组装的。
除了将0x29放在错误的位置外,它还是0x28。请记住,起始地址为0,因此.data节的第41个字节的偏移量为40。
数据部分的第一个字节的偏移量为0。