我一直在尝试使用mips火星实现抽搐矩阵。我一直有一些问题产生它。 所以我得到的是这个,我可以打开一个图像文件(512x512)将其转换为灰度,然后当我尝试应用痉挛时我只得到一个黑色方块: 这是整个计划:
.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