我想用循环打印data1的2个值,但是我无法正确找到2个元素的地址,并且我得到了一个越界错误。
当我运行代码时,输出为(null)(null)
。
.data
DATA: .word data1,data2,data3
data1: .word nome1,cognome1
name1: .asciiz "john"
surname1: .asciiz "cena"
data2: .word nome2,cognome2
name2: .asciiz "giorno"
surname2: .asciiz "giovana"
data3: .word nome3,cognome3
name3: .asciiz "nikola"
surname3: .asciiz "tesla"
.text
main:
addi $s0, $zero, 0
li $t5,1 ##counter
while:
la $s1,DATA
la $s2,0($s1)
do:
li $s3,3 ##if s3 = 3 end
beq $s3,$t5,exit
lw $t1,0($s2) ## print elements in data1
la $a0,0($t2)
li $v0,4
syscall
addi $t5,$t5,1
increaseS1: ##increase s1 so you can print next data
addi $s2, $s2, 4
j do
exit:
li $v0,10 # exit
syscall
如何在不使代码太大的情况下正确定位地址?这个程序的想法是通过循环和试听索引来逐个打印所有DATA
元素。
答案 0 :(得分:2)
data1: .word name1,surname1
< - 不应该是lw $t1,0($s2)
?
所以在 DATA 中,你有三个关于 dataN 数据的指针,而 dataN 包含两个指向ascii零终止字符串的指针。< / p>
但代码看起来只是加载指向 dataN 数据(lw $t2,0($t1)
)的指针,而不是加载字符串本身的指针。你必须使用$ t1加载第一个指向name的指针,调用syscall来显示它,然后再次加载指向surname的第二个指针并显示它。对于姓名可能会lw $t2,2($t1)
,而对于姓氏可能会li $s3,3
。
编辑:我的答案的下一段是错的,现在我看到你在那里做了什么($ t5是计数器,并且它可能正确使用,除了不使用它进行数据访问..这需要计数从0开始,而不是从1开始。
但看起来你是在使用随机寄存器而不是按值加载它们,比如DATA
,看起来$ s3应该是lw $t1,0($s2)
的索引,但你不要&# 39; t将其初始化为零,并且您不会在NSDictionary
中使用它来获取* dataN *指针。
如果您确实有一些交互式调试器,请尝试使用您的代码,看看寄存器是如何填充/使用的,我认为您是从不同的部分复制/粘贴代码(每个代码使用它自己的寄存器),所以他们不会一起工作。
你必须决定放入哪个寄存器,然后在其余代码中坚持使用。