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 来自不同部分的代码(每个部分都使用自己的寄存器),所以他们不会一起工作。
您必须决定将什么放入哪个寄存器,然后在其余代码中坚持执行。
我想用循环打印 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 来自不同部分的代码(每个部分都使用自己的寄存器),所以他们不会一起工作。
您必须决定将什么放入哪个寄存器,然后在其余代码中坚持执行。