i've been trying to implement a convulsion matrix using mips mars. and i've been having some issues generating it. So what i've got is this, i can open a image file (512x512) convert it to grayscale and then when i try to apply the convulsion i only get a black square: here's the whole program:
.data
#uncoment
buffer: .space 786432 # buffer para imagens para 512x512
bufferGray: .space 262144 # buffer para imagens cinza 512 x 512
#
#uncoment after 32x32
bufferSobelH: .space 262144 #array sobel horizontal
bufferSobelV: .space 262144 #array sobel Vertical
bufferSomaSobel: .space 262144 #array Somas sobel
bufferFinal: .space 262144 #array final
#
#Arrays Sobel
SobellV: .byte 1,2,1,0,0,0,-1,-2,-1 #Sobel Vertical
SobellH: .byte 1,0,-1,2,0,-2,1,0,-1 #Sobel Horizontal
.text
main:
#funcao para efectuar a convolution
#argumentos $a0 array de origem escala cinzentos
#argumentos $a1 array de destino ou o sobel horizontal ou vertical
#argumentos $a2 array sobel a usar
la $a0,bufferGray #carrega o endereco buffer imagem em cinzento
la $a1,bufferSobelH # carrega o endereco do buffer para conter o sobel horizontal
la $a2, SobellH #carrega o array sobel horizontal
jal convolution
nop
jal write_gray_image
nop
jal SafeExit
nop
#funcao para efectuar a convolution
#argumentos $a0 array de origem escala cinzentos
#argumentos $a1 array de destino ou o sobel horizontal ou vertical
#argumentos $a2 array sobel a usar
#argumentos $a3 contador
convolution:
addi $sp,$sp,-4
sw $ra,0($sp)
addi $a0,$a0,512 #incrementa uma linha
addi $a3,$a3,-512 #retira 512 ao valor do contador para eliminar a linha
jal filter
nop
filter:
blt $a3,512,endsobel
nop
#carrega os bytes matrix cinzento
lbu $t0,0($a0)#carrega o valor da escala de cinzentos
#
#carrega o centro da matrix
lbu $t1,4($a2)
#
#multiplica cada byte(componente) pelo valor da matrix
mul $s0,$t0,$t1
#
#########################################################
#carrega o valor da matrix a direita
lbu $t0,1($a0)
lbu $t1,5($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#########################################################
#carrega o valor da matrix a esquerda
lbu $t0,-1($a0)#o valor da matrix a esquerda
lbu $t1,3($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#sobe uma linha
add $a0,$a0,-512
#
#carrega os bytes matrix cinzento
lbu $t0,0($a0)#carrega o valor da escala de cinzentos
#
#carrega o centro da matrix
lbu $t1,1($a2)
#
#multiplica cada byte(componente) pelo valor da matrix
mul $t2,$t0,$t1
add $s0,$s0,$t2
#
#########################################################
#carrega o valor da matrix a direita
lbu $t0,1($a0)
lbu $t1,2($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#########################################################
#carrega o valor da matrix a esquerda
lbu $t0,-1($a0)#o valor da matrix a esquerda
lbu $t1,0($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#desce 2 linhas
add $a0,$a0,1024
#
#carrega os bytes matrix cinzento
lbu $t0,0($a0)#carrega o valor da escala de cinzentos
#
#carrega o centro da matrix
lbu $t1,7($a2)
#
#multiplica cada byte(componente) pelo valor da matrix
mul $t2,$t0,$t1
add $s0,$s0,$t2
#
#########################################################
#carrega o valor da matrix a direita
lbu $t0,1($a0)
lbu $t1,8($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#########################################################
#carrega o valor da matrix a esquerda
lbu $t0,-1($a0)#o valor da matrix a esquerda
lbu $t1,6($a2)
mul $t2,$t0,$t1
add $s0,$s0,$t2
#########################################################
#sobe uma linha
add $a0,$a0,512
#
sra $s0,$s0,2
abs $s0, $s0
sb $s0,0($a1)
addi $a0,$a0,1
addi $a1,$a1,1
addi $a3,$a3,-1
beq $zero,$zero,filter
nop
endsobel:
#exit here
lw $ra,0($sp) #exit sobel
addi $sp,$sp,4
jr $ra
nop