I’m working on a homework assignment that requires me to compute the grayscale value of a series of hex values in an array. That’s the part I understand. I need to loop through this array of values until a -1 is encountered. Here’s what I’ve got:
# --------------------------------
# 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
I know that 48 needs to be incremented by 4 for every iteration of the loop, I just have no idea how to do this in MIPS. Any help is much appreciated!
What you should do is use some register to hold the value of the index of the array you are working with, and in each iteration increment that register with 4.
It is also a bad idea to just put the constant where your array is located, because if you later change the location in memory of your array you have to update that constant too. Instead, use a label and let the assembler figure out the actual location.
Suppose we use register $a1 to hold the index. Then, we just need to make some minor changes to your code: