到目前为止,我已经编写了一个完全不使用数据存储器的汇编程序。现在,我正在尝试编写一个超级简单的程序,该程序存储一个值,然后将该值加载到另一个寄存器中(并打印出内容以确保我理智)。
li $t0, 13 # data that I want to store
li $v0, 1
move $a0, $t0
syscall
sw $t0, 0($zero) # error
#lw $t1, 32
#li $v0, 1
#move $a0, $t1
#syscall
我不断收到“地址超出范围”错误。我尝试将偏移量更改为不同的值(4、8、32),甚至尝试将立即数加载到寄存器中,所以我不使用$ zero寄存器。
如果我所有程序都具有数据,该如何用作基址?将数据值存储在地址零怎么办?我的教科书/大脑让我相信,这绝对没问题。
答案 0 :(得分:1)
这是因为没有内存映射到地址0。它很可能在0x10000000(在MARS中通常为0x10010000)之后的某个位置,当您查看模拟器的数据段窗口时就会看到。
因此,如果您想在数据段的开头访问单词,请贴上标签
即:
.data
startofdata: .word 0
并在代码部分:
la $a0, startofdata
sw $t0, 0($a0)
如果您要标记每个位置以使其更具可读性,则startdata可能被命名为error