ppm图像的BGR到RGB的Mips转换

ppm图像的BGR到RGB的Mips转换,mips,rgb,bgr,Mips,Rgb,Bgr,我正在做一个作业,我被困在从BGR(蓝色,绿色,红色)到RGB(红色,绿色,蓝色)的转换上。我一直在尝试反转代码的位置,注意到十六进制代码的前2位没有被使用,其他6对分别对应于RGB或BGR。以下是我一直在构建的代码: .data FILENAME: .asciiz "C:/Users/conta/Desktop/mario.ppm" ERROROPEN: .asciiz "Erro ao abrir o arquivo." STR: .space 512

我正在做一个作业,我被困在从BGR(蓝色,绿色,红色)到RGB(红色,绿色,蓝色)的转换上。我一直在尝试反转代码的位置,注意到十六进制代码的前2位没有被使用,其他6对分别对应于RGB或BGR。以下是我一直在构建的代码:

.data
FILENAME: .asciiz "C:/Users/conta/Desktop/mario.ppm"
ERROROPEN: .asciiz "Erro ao abrir o arquivo."
STR: .space 512

.text
    
    li $t7, 4       #Número de quebras de linhas no arquivo ppm
    li $t8, 0x0a        # \n
    li $t9, 0       #contador

    la $a0, FILENAME    #Nome do arquivo a ser aberto.
    li $a1, 0       #Sempre zero.
    li $a2, 0       #0 para leitura 1 para escrita.
    li $v0, 13      #syscall 13 (open file).
    syscall
    
    bltz $v0, end_error #menor que zero significa que nao encontrou o arquivo.

    move $a0, $v0       #v0 possui o descritor de arquivo.
    la $a1, STR     #endereco para armazernar os caracteres lidos.
    li $a2, 1       #ler apenas 1 byte.
    
readloopcabecalho:

    beq $t9, 4, preparacao 

    li $v0, 14      #syscall 14
    syscall
    
    lb $t4, 0($a1)
    beq $t4, $t8, cont
    addi $a1, $a1, 4        #incrementa para o proximo endereco de $a1.
    
    bnez $v0, readloopcabecalho #enquanto v0 for diferente de 0 continua.
    
preparacao:

    la $a1, 0x10040000  
    j readlooppixel
    
readlooppixel:  
    
    beq $t5, 3, zera_pula
    li $v0, 14          #syscall 14
    syscall
    addi $a1, $a1, 1        #incrementa para o proximo endereco de $a1.
    j cont2
            
zera_pula:

    
    move  $t5, $zero
    addi $a1, $a1, 1
    j readlooppixel 
                
                                    
cont2:
    
    addi $t5, $t5, 1
    bnez $v0, readlooppixel     #enquanto v0 for diferente de 0 continua.
    j preparacao2

cont:
    
    addi $t9, $t9, 1
    j readloopcabecalho
    
preparacao2:

    la $a1, 0x10040000  
    j arrumandopixel
    
arrumandopixel:

    lw  $t3, 0($a1)
    sw $t3, 0($a1)
    addi $a1, $a1, 4            #incrementa para o proximo endereco de $a1.
    bne $a1, 0x10080000, arrumandopixel

    j printcabecalho
    
printcabecalho:

    la $a0, STR     #puxando STR para $a0 para aplicar o syscall
    
    li $v0, 4       #syscall para printar o cabeçalho
    syscall         #porem está printando somente o primeiro caractere que foi gravado no endereço
    
    j end
    
end_error:
 
    la $a0, ERROROPEN
    li $v0, 4
    syscall

end:

    li $v0, 10
    syscall

我的葡萄牙语?西班牙语不是很好,所以评论很难。但是,我可以问一下传入的数据是什么格式的吗?24位BGR?16位,5/6/5/BGR,或者32位BGRA?还有别的吗?这将有助于理解交换位/字节所需的算法。如果颜色通道是字节,您应该能够很容易地通过将3个通道读入寄存器并以不同的顺序写入它们来交换。这是葡萄牙语和24位BGR。我不能把头转过来,我试过使用
srl
sll
但没有成功好的,要从BGC转换为RGB,您应该将3个8位强度值读入3个寄存器,然后以相反的顺序写回。您可以使用1个寄存器来完成,但要获得正确的写入顺序会稍微困难一些。你不需要把G还原到正确的位置,只需交换B和RSure,但是一次读取3个像素会使代码的阅读和理解更加清晰。它还解决了在读取数据之前覆盖数据的问题。