2012-10-04 236 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