将24位位图图像的红色部分加载到数组中

时间:2019-05-13 04:55:27

标签: assembly bitmap mips mars-simulator

假设我有一个 200 x 200 pix 24位BMP图片。
我想将 red 组件加载到名为list的数组中。

image: .space 120054
list: .space 8160  

# ... ... ...

LoadGreenComponentToList:
    sub $sp, $sp, 4     #push $ra to the stack
    sw $ra,4($sp)

    la $t1, image + 10  #adress of file offset to pixel array
    lw $t2, ($t1)       #file offset to pixel array in $t2

    li  $t5, BMP_FILE_SIZE
    sub $t5, $t5, $t2   # ? 
    div $t5, $t5, 3     # ?

    la $t1, image       # adress of bitmap
    add $t2, $t1, $t2   # adress of pixel array in $t2

    #fill the array with red values
    add $t2, $t2, 1 # ? 
    li $t3, 0       # $t3 is the counter of loop
    li $t4, 0

loop_through_pixels:
    beq $t3, $t5, get_pixel_end
    la $t6, list        # $t6 = array address

    mul $t4, $t3, 3     # $t4 = 3* $t3
    add $t4, $t2, $t4   # $t4 = $t4 + $t2
    lb $t1,($t4)        # ?

    #save to array
    #sb $t1, ($t6)
    #add $t6, $t6, 4

    #inc array
    mul $t1, $t1, 4 #or 4
    add $t6, $t6, $t1
    lw $t7, ($t6)   
    addi $t7, $t7, 1
    sw  $t7, ($t6)

    add $t3, $t3, 1
    j loop_through_pixels 

get_pixel_end:                                              
    lw $ra, 4($sp)      #restore (pop) $ra
    add $sp, $sp, 4
    jr $ra

此代码加载绿色组件。

如何将其转换为可以在Red上运行?

我还认为list的大小不正确。

1 个答案:

答案 0 :(得分:2)

假设它们存储为<red_byte><green_byte><blue_byte><blue_byte><green_byte><red_byte>,那么我想这是您的问题:

la $t1, image       # adress of bitmap
add $t2, $t1, $t2   # adress of pixel array in $t2

#fill the array with red values
add $t2, $t2, 1 # ? 

本质上,这与该伪代码等效:

PixelBuffer * buf = GetBitmap();
buf++;

突然之间,您突然不在像素缓冲区的底部(这是指向第二个字节),从而开始了像素迭代。

[r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b]
    ^ -- pointing here at the start of the loop

此行进一步向下:

mul $t4, $t3, 3     # $t4 = 3* $t3
add $t4, $t2, $t4   # $t4 = $t4 + $t2

这是3的跳跃-跳到每个下一个完整像素部分:

[r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b][r][g][b]
    ^ ------ ^ ------ ^ ------ ^ ------ ^ ------ ^ ------ ^

因此,在两种情况下的任何一种情况下(我都不记得像素数据以什么顺序存储在..中),请删除第一段代码:

########### REMOVED: add $t2, $t2, 1 # ? 

...如果是RGB。或者,将其更改为此:

add $t2, $t2, 2 # ? 

...如果是BGR。

我几乎可以肯定BMP是存储BGR的,因此选项2可能是正确的调用。