MIPS,从数组打印存储的数据

时间:2016-06-03 09:07:49

标签: assembly mips

我想用循环打印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元素。

1 个答案:

答案 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 *指针。

如果您确实有一些交互式调试器,请尝试使用您的代码,看看寄存器是如何填充/使用的,我认为您是从不同的部分复制/粘贴代码(每个代码使用它自己的寄存器),所以他们不会一起工作。

必须决定放入哪个寄存器,然后在其余代码中坚持使用。