Mips BMP-файл Получение значения пикселя - PullRequest
0 голосов
/ 08 января 2020

Я работаю над проектом распознавания изображений со сборкой MIPS и пытаюсь получить значение цвета в файле .bmp. У меня есть этот кусок кода, который должен дать мне правильный результат в регистре $ v0, но он возвращает мне 0x00000000 (который черный). Я использовал Paint для рисования исходного файла в разные цвета, но получаю 0x00000000. Может ли кто-нибудь помочь мне, почему это происходит?

#only 24-bits 600x50 pixels BMP files are supported
.eqv BMP_FILE_SIZE 90122
.eqv BYTES_PER_ROW 1800

    .data
#space for the 600x50px 24-bits bmp image
.align 4
res:    .space 2
image:  .space BMP_FILE_SIZE

fname:  .asciiz "source.bmp"
    .text
main:
    jal read_bmp

    #get pixel color - $a0=x, $a1=y, result $v0=0x00RRGGBB
    li  $a0, 0      #x
    li  $a1, 0      #y
    jal     get_pixel

read_bmp:
#description: 
#   reads the contents of a bmp file into memory
#arguments:
#   none
#return value: none
    sub $sp, $sp, 4     #push $ra to the stack
    sw $ra,4($sp)
    sub $sp, $sp, 4     #push $s1
    sw $s1, 4($sp)
#open file
    li $v0, 13
        la $a0, fname       #file name 
        li $a1, 0       #flags: 0-read file
        li $a2, 0       #mode: ignored
        syscall
    move $s1, $v0      # save the file descriptor

#check for errors - if the file was opened
#...

#read file
    li $v0, 14
    move $a0, $s1
    la $a1, image
    li $a2, BMP_FILE_SIZE
    syscall

#close file
    li $v0, 16
    move $a0, $s1
        syscall

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

get_pixel:
#description: 
#   returns color of specified pixel
#arguments:
#   $a0 - x coordinate
#   $a1 - y coordinate - (0,0) - bottom left corner
#return value:
#   $v0 - 0RGB - pixel color

    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
    la $t1, image       #adress of bitmap
    add $t2, $t1, $t2   #adress of pixel array in $t2

    #pixel address calculation
    mul $t1, $a1, BYTES_PER_ROW #t1= y*BYTES_PER_ROW
    move $t3, $a0       
    sll $a0, $a0, 1
    add $t3, $t3, $a0   #$t3= 3*x
    add $t1, $t1, $t3   #$t1 = 3x + y*BYTES_PER_ROW
    add $t2, $t2, $t1   #pixel address 

    #get color
    lbu $v0,($t2)       #load B
    lbu $t1,1($t2)      #load G
    sll $t1,$t1,8
    or $v0, $v0, $t1
    lbu $t1,2($t2)      #load R
        sll $t1,$t1,16
    or $v0, $v0, $t1

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


...