循环通过数组mips

时间:2012-10-04 00:29:00

标签: arrays loops mips

我正在完成一项家庭作业,要求我计算数组中一系列十六进制值的灰度值。这是我理解的部分。我需要遍历这个值数组,直到遇到-1。这就是我所拥有的:

 # --------------------------------
# Below is the expected output.
# 
# Converting pixels to grayscale:
# 0
# 1
# 2
# 34
# 5
# 67
# 89
# Finished.
# -- program is finished running --
#---------------------------------

.data 0x0
    startString:    .asciiz "Converting pixels to grayscale:\n"
    finishString:   .asciiz "Finished."
    newline:    .asciiz "\n"
    pixels:     .word   0x00010000, 0x010101,   0x6,        0x3333, 
                0x030c,     0x700853,   0x294999,   -1

.text 0x3000

main:
    ori $v0, $0, 4              #System call code 4 for printing a string
    ori $a0, $0, 0x0            #address of startString is in $a0
    syscall                 #print the string

LOOP:   ori $a0, $0, 0x0 
    lw $t1, 48($a0)
    beq $t1 -1, exit
    addi $t4, $0, 3
    sll $t2, $t1, 8
    srl $s1, $t2, 24    #$s1 becomes red value
    sll $t2, $t1, 16
    srl $s2, $t2, 24    #$s2 becomes green value
    sll $t2, $t1, 24
    srl $s3, $t2, 24    #$s3 become blue value
    add $t1, $s1, $s2
    add $t1, $t1, $s3
    div $t1, $t4
    mflo $s4        #$s4 becomes grayscale value
    or $a0, $0, $s4
    ori $v0, $0, 1
    syscall
    ori $v0, $0, 4
    ori $a0, $0, 43
    syscall
    j LOOP

exit:

    ori $v0, $0, 4              #System call code 4 for printing a string
    ori $a0, $0, 33             #address of finishString is in $a0; we computed this
                        #  simply by counting the number of chars in startString,
                        #  including the \n and the terminating \0

    syscall                 #print the string

    ori $v0, $0, 10             #System call code 10 for exit
    syscall                 #exit the program

我知道,对于循环的每次迭代,48需要增加4,我只是不知道如何在MIPS中执行此操作。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你应该做的是使用一些寄存器来保存你正在使用的数组的索引值,并在每次迭代增量中注册4。

将常量放在数组所在的位置也是一个坏主意,因为如果稍后更改数组内存中的位置,则必须更新该常量。相反,使用标签让汇编程序找出实际位置。

假设我们使用寄存器$ a1来保存索引。然后,我们只需要对您的代码进行一些小的更改:

    ori $a1, $0, 0x0   # Initialize index with 0
LOOP:  
    lw $t1, pixels($a1)  # We use the label name instead of the actual constant
         ...
         ...
    addi $a1, $a1, 4   # Increment index by 4
    j LOOP