2012-10-04 213 views
0

我正在做一个家庭作业,需要我计算数组中一系列十六进制值的灰度值。这是我理解的部分。我需要遍历这个值的数组,直到遇到-1。下面是我得到了什么:循环通过数组mips

# -------------------------------- 
# 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

你应该做的是使用一些寄存器来保存您正在使用数组的索引值,并在每次迭代增量与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 
+0

我意识到,用48代替像素是不好的做法,我们的老师只是告诉我们那样做了,现在哈哈。并感谢您的帮助!我明白现在该做什么。 – Haskell