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

MIPS , printing stored data from array

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

data1: .word nome1,cognome1 <- 不应该是 data1: .word name1,surname1 吗?

所以在 DATA 中你有三个指向 dataN 数据的指针,并且 dataN 包含两个指向 ascii 零终止字符串的指针。

但是代码看起来您​​只加载了指向 dataN 数据 (lw $t1,0($s2)) 的指针,而不是加载字符串本身的指针。您必须使用 $t1 加载第一个指向名称的指针,调用系统调用来显示它,然后再次加载第二个指向姓氏的指针并显示它。名字可能是 lw $t2,0($t1),姓氏可能是 lw $t2,2($t1)

编辑:我的回答的下一段是错误的,现在我明白你在那里做了什么($t5 是计数器,它的使用可能是正确的,除了没有将它用于 DATA 访问..那需要从 0 开始计数, 不是来自 1).

但看起来你到处都在使用随机寄存器,而没有按值加载它们,比如 li $s3,3,看起来 $s3 应该是 DATA 上的索引,但是你没有将它初始化为零,你也没有在 lw $t1,0($s2) 中使用它来获取 *dataN* 指针。

如果您确实有一些交互式调试器,请尝试您的代码并查看寄存器如何 filled/used,我认为您是 copy/pasting 来自不同部分的代码(每个部分都使用自己的寄存器),所以他们不会一起工作。

必须决定将什么放入哪个寄存器,然后在其余代码中坚持执行。