【问题标题】:Efficient Way to Print MIPS Int Array打印 MIPS Int 数组的有效方法
【发布时间】:2009-11-10 18:48:17
【问题描述】:

我正在做一项家庭作业,将我们编写的 C 程序翻译到 MIPS。我的问题是关于一般 MIPS 编码而不是项目具体问题。我遇到了打印输出的问题。我有一个这样声明的数组和输出字符串:

array: .word 7, 2, 5, -3, 3, 6, -4, 1  
output1: .asciiz "Array: \0"

我正在尝试输出数据,所以我有以下格式:

Array: 7 2 5 -3 3 6 -4 1

我们的数组是硬编码的,我们的数组长度是预先确定的。我试图想出一个循环来有效地打印出来,但是使用寄存器处理 lw 偏移量是一个问题。
我想出了以下代码来硬编码我的输出,但我还有另一个数组需要打印,这似乎占用了很多空间。我的代码功能齐全,但只是一团糟!谁能给我一些清理/重构它的提示?
数组存放在$a0/$s0,数组大小存放在$a1/$s1

la $a0, output1 # print the "Array: " string
li $v0, 4
syscall

# Huge Oversized Print Statement to print out the original Array: 
li $v0, 1 # print the array
lw $a0, 0($s0)
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
li $v0, 1
lw $a0, 4($s0)
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 8($s0)
li $v0, 1
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 12($s0)
li $v0, 1
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 16($s0)
li $v0, 1
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 20($s0)
li $v0, 1
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 24($s0)
li $v0, 1
syscall
la $a0, space #print the space between elements
li $v0, 4
syscall
lw $a0, 28($s0)
li $v0, 1
syscall

这是一个家庭作业项目,我真的很想完全了解一种更简洁的打印数组的方法,我不想抄袭。非常感谢编写循环的提示,我不是在找人给我代码。

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    使用addi 增加$s0 可能会有所帮助,而不是手动更改偏移量——这样您总是使用lw 0($s0)

    编辑:我想我应该补充一点,您正在循环中增加 $s0(使用 j 循环)。

    【讨论】:

    • 如果不想覆盖$s0,只需使用另一个通用寄存器遍历数组即可。
    • 好主意!我一直在尝试使用寄存器来存储偏移量,但据我了解,这不是有效的 MIPS。始终使用 0 偏移量而不是增加寄存器本身似乎是可行的方法。我试试看!
    • 工作就像一个魅力,把整个混乱变成了大约 10-12 行,可以重复用于我的其他输出,在我的程序完全正常运行后将继续重构。
    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多