# # Autor(s) : Jordi Ferrer Plana # e-mail : jferrerp@eia.udg.es # Branch : - # # Working Group : Departament d'Electrònica, Informàtica i Automàtica # Project : Examen d'ETIS/ETIG d'Estructura i Tecnologia de Computadors, # 1era convocatòria, any 2005. # Homepage : http://eia.udg.es/etc/ # # Module : Problema 5. Binarització. # # File : binary.s # Date : 09/06/2004 - 14/06/2006 # # Compiler : Spim >= 6.3 # Libraries : - # # Notes : - Versió 2.0: Canviat el "Si-Llavors" per un sgt de "binary". # - Canviats els registres $t2 i $t3 d'ordre a l'"sgt". # # ---------------------------------------------------------------------------- # # Copyright (C) 2004-2005, Jordi Ferrer Plana # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU General Public License (http://www.gnu.org/copyleft/) # for more details. # # ---------------------------------------------------------------------------- # .data # No cal guardar les mides a memòria WIDTH=192 # Amplada de les imatges HEIGHT=144 # Altura de les imatges N=27648 # 192 x 144 * 1 Byte = 27648 THRESHOLD = 70 # LLindar de binarització # Espai per les matrius (Imatges) SourceGrayImg: .space N # Espai per la Imatge origen DestBinImg: .space N # Espai per la Imatge binaria .end .text # # void binary ( unsigned char *SourceGrayImg, unsigned char *DestBinImg, # unsigned int Width, unsigned int Height, # unsigned char Threshold ); # # # NOTES: # En conveni MIPS: # Es pot utilitzar $t0 - $t9 dins la funció sense guardar-los. # Els paràmetres estaran a: # a0: Adreça de la Imatge Origen (Gray) : Enter sense signe # a1: Adreça de la Imatge Destí (Binary) : Enter sense signe # a2: Width : Enter. # a3: Height : Enter. # A partir del 4art estaran a la pila (tot i que és un byte, es # reserva una paraula entera per mantenir la pila alineada a "word"): # 0($sp): Threshold : Byte sense signe. # # No es guardarà res a la pila ja que no cal. # binary: mul $t1, $a2, $a3 # $t1 <- Width * Height li $t0, 0 # i = 0 lw $t3, 0($sp) # $t3 <- Threshold fori: bge $t0, $t1, exitfi # while i < Mida Imatge add $t2, $a0, $t0 # $t2 <- @ImgSrc + Offs pixel i lbu $t2, 0($t2) # $t2 <- Pixel original (gris) sgt $t4, $t3, $t2 # $t4 <- '$t3 > $t2' add $t2, $a1, $t0 # $t2 <- @ImgDst + Offs pixel i sb $t4, 0($t2) # Mem <- pixel binari calculat addi $t0, $t0, 1 # i++ (Següent píxel) j fori # Iterar exitfi: jr $ra # Retonar a l'invocador .end .text # # int main ( void ) # # Exemple de crida a binary ( SourceGrayImg, DestBinImg, # WIDTH, HEIGHT, THRESHOLD ); # main: subu $sp, $sp, 4 # Fer espai a la pila per sw $ra, 0($sp) # guardar l'adreça de retorn # Quatre paràmetres per registre: la $a0, SourceGrayImg # Adreça de la Imatge origen la $a1, DestBinImg # Adreça de la Imatge destí li $a2, WIDTH # Amplada li $a3, HEIGHT # Altura li $t0, THRESHOLD # El cinquè paràmetre per pila: subu $sp, $sp, 4 # Fer espai per una paraula sw $t0, 0($sp) # Guardar-lo a la pila jal binary # Crida a "binary" addu $sp, $sp, 4 # Desempilar el paràmetre lw $ra, 0($sp) # Recuperar adreça de retorn addu $sp, $sp, 4 # Desempilar li $v0, 0 # Valor 0 de retorn a l'invocador jr $ra # Retonar a l'invocador .end