Вы находитесь на странице: 1из 16

Trabajo Pr actico No 1

Juli an Garbiso, Padr on Nro. 88.515 jpgarbiso@gmail.com Virginia Gonz alez, Padr on Nro. 89.557 virginiajgonzalez@gmail.com Pablo Hurtado, Padr on Nro. 89.542 hurtado.pani@gmail.com
Grupo Nro. 1 - 1er. Cuatrimestre de 2010 66.20 Organizaci on de Computadoras Facultad de Ingenier a, Universidad de Buenos Aires

Resumen Se implement o en lenguaje C un programa que recibe dos vectores por entrada standard y por par ametro y llama a una funci on que realiza la convoluci on de dichos vectores. Esta funci on se implement o tambi en en c odigo MIPS, respetando las convenciones de la Application Binary Interface (ABI). Para esto se arm o un diagrama del stack frame de la funci on antes de codicarla. Para emular la m aquina MIPS, se utiliz o el programa gxemul con el sistema operativo NetBSD corriendo en la m aquina virtual.

Indice
1. Introducci on 2. Documentaci on de desarrollo 2.1. Dise no e Implementaci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Utilizaci on del programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Instrucciones de compilaci on 4. Corridas de prueba 5. Conclusiones 6. Ap endice A: C odigos 6.1. C odigo C . . . . . 6.1.1. dconv.c . . 6.1.2. main.c . . . 6.2. C odigo MIPS . . . 6.2.1. dconv.S . . 3 3 3 4 5 5 6 7 7 7 8 14 14

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

1.

Introducci on

La Application Binary Interface (ABI) describe la interfaz de bajo nivel entre una aplicaci on y el sistema operativo (u otra aplicaci on). Se cubren muchos aspectos, pero para este trabajo nos centramos en la convenci on que respecta a los llamados a funciones. Esta especica la forma en que una funci on recibe argumentos y devuelve un valor de retorno: cada funci on crea siempre su stack frame, reservando los bytes necesarios en memoria. El stack frame se divide en 4 areas (aunque algunas no son obligatorias) de tama no m ultiplo de 8 bytes: La Register Saved Area donde se guardan fp, gp (ambos en forma obligatoria), ra (si la funci on realizar a llamados a otras funciones) y, de ser necesario, s0 . . . s7. La Floating-Point Registers Saved Area, donde se guardan, de ser usados, los registros de punto otante (f20 . . . f30 ). La Local and temporary Variables Area, para almacenar variables locales. La Argument Building Area, creada s olo si la funci on realiza llamados a otras funciones. En tal caso, se reserva espacio para la m axima cantidad de argumentos que reciban tales funciones. Los primeros 16 bytes guardan el contenido de los registros a0 . . . a3 y, de haber m as argumentos, se guardan por encima de estos. Cabe aclarar que los argumentos son guardados en el stack frame de la funci on llamadora (caller ), y la encargada de hacer esto es la funci on llamada (callee ). En el presente trabajo se codic o en MIPS una funci on que realiza la convoluci on de dos vectores, y dicha funci on sigui o la convenci on descripta.

2.
2.1.

Documentaci on de desarrollo
Dise no e Implementaci on

El programa fue implementado totalmente en C, pero adem as se escribi o una versi on de la funci on conv en MIPS Assembly. La interfaz de usuario se limita a la l nea de comandos de Unix. Esta se analiza en la secci on 2.2. Para facilitar la obtenci on los par ametros pasados por l nea de comandos se utiliz o la biblioteca getopt.h, la cual se encuentra disponible tanto en Linux como en NetBSD. Dada una entrada v alida, el programa procesa los datos ingresados y, previa validaci on, los transforma en vectores de n umeros de punto otante de simple precisi on. El n ucleo de la operaci on del programa se encuentra en la funci on conv, que realiza la operaci on de convoluci on discreta [2] entre dichos dos vectores. Esta se basa en dos ciclos for anidados. El resultado de la operaci on se guarda en un arreglo de float, que es la variable global y. La gura 1 muestra el stack frame de la funci on conv implementada en MIPS assembly. Siguiendo la ABI descrita en [1], se reserva espacio en el area de variables locales y temporales para las variables locales f, m, count e i, y en el area de registros guardados se guardan los valores el global pointer y el frame pointer al momento de la llamada a la funcion conv. No se reserva espacio para la Argument Building Area porque la funci on es leaf. Adem as, la funci on conv guarda en el Argument Building Area del stack frame de su llamadora los argumentos que le han sido pasados.

c a l l e r

...
16 12 8 4 0 20

c o n v

16 12 8 4 0

hsize h xsize x fp gp i count m f

Argument Building Area

Saved Registers Area

Local and Temporary Variables Area

Figura 1: Stack Frame para la funci on conv, m as la parte de main donde se guardan los argumentos pasados a conv

2.2.

Utilizaci on del programa

Para obtener ayuda en pantalla, utilice la opci on -h. # ./tp1 -h Usage: ./tp1 -h ./tp1 -V ./tp1 [options] Options: -V, --version Imprime la version y termina. -h, --help Imprime esta informacion y termina. -r, --response Nombre del archivo que especifica h[n]. -p, --pulse Pulso que representa h[n] entre dos valores de n. Examples: ./tp1 ./tp1 -p [1 2] ./tp1 -p 8*[1 2] echo -n "[1.4 2.5 3.0]"| ./tp1 -r r.data Importante. En todos los casos, se debe delimitar los vectores dato con corchetes ([ ]). El programa no aceptar a entradas que no contengan corchetes. El formato de cualquier vector ingresado debe ser el siguiente: [ a0 a1 . . . an ] Si la ejecuci on es exitosa, el programa escribe en stdout el resultado del producto de convoluci on entre x y h:

y [n] =
m=

x[m] h[n m]

A continuaci on se detallan los modos de operaci on de cada una de las opciones. -V o version: Muestra informaci on de la versi on.

-h o help: Muestra el mensaje de ayuda presentado anteriormente. -r o response: Toma como argumento el nombre de un archivo que contiene un vector con el formato ya especicado, el cual representa h[n]. Si contiene m as de un vector, s olo ser a procesado el primero. El vector x[n] se toma desde stdin. -p o pulse: Toma como argumento un pulso entre dos valores de n. La sintaxis es k [ p0 p1 ], p0 es el valor inicial del pulso, p1 el valor nal del mismo, y k la altura del pulso. Por ejemplo, la entrada -p 4*[3 5] genera un vector [ 4 4 4 ] (lo que importa es la diferencia entre el valor nal y el inicial, ya que el resultado depende del largo del intervalo y no de cu al sea este, y fuera del intervalo el resultado es siempre 0; es decir que un pulso entre 3 y 5 se interpreta igual que un pulso entre 1 y 3). Si se omite m se toma m = 1. p0 debe ser menor o igual a p1 . El vector x[n] se toma desde stdin.

3.

Instrucciones de compilaci on

Para compilar el programa con la versi on escrita en C de la funci on conv, ejecute: $ make generic Alternativamente, escriba $ gcc -o tp1 -Wall -g -lm main.c dconv.c En MIPS se puede compilar con la versi on escrita en MIPS Assembly de dicha funci on. Para ello ejecute: $ make mips O bien: $ gcc -o tp1 -Wall -g -lm main.c dconv.S

4.

Corridas de prueba
La salida esperada de cada prueba se tom o realizando la convoluci on con el programa Octave.

/* Se cargan los datos del vector h */ # cat r.data [8 2 1] /* Se espera como salida [24 38 51 14 5] */ # echo "[3 4 5]"|./tp1 -r r.data [ 24 38 51 14 5 ] # cat h1.data [1 2 3] /* Se espera [ 1 6 20 46 59 48 ] */ # echo -n "[1 4 9 16]"|./tp1 -r h1.data [ 1 6 20 46 59 48 ] /* Se espera [ 2 10 28 60 58 50 32 ] */ # echo -n "[1 4 9 16]"|./tp1 -p "2*[1 4]" [ 2 10 28 60 58 50 32 ] # cat h2.data [5 4 2 4.23 2 9.12 7] /* Se espera [ 25 80 103 81.15 78.76 107.67 162.44 166.08 63 ] */ # echo -n "[5 12 9]"|./tp1 -r h2.data [ 25 80 103 81.15 78.76 107.67 162.44 166.08 63 ] /* Se espera [ 20.536 70.6 107.52 107.52 86.984 36.92 ] # echo -n "[5.134 12.516 9.23]"|./tp1 -p "4*[3 6]" [ 20.536 70.6 107.52 107.52 86.984 36.92 ]

5.

Conclusiones

Tras la escritura del c odigo MIPS de la convoluci on discreta se cheque o exitosamente el correcto funcionamiento del mismo. De este modo comprobamos la utilidad de la ABI para la realizaci on de llamados a funciones y procedimientos, respondiendo en nuestro c odigo a las convenciones para pasajes de par ametros y guardado de registros en los stack frames de la funci on llamadora o la funci on llamada. Por otro lado, comprobamos tambi en el correcto funcionamiento del conjunto de instrucciones de MIPS, dado que al haber corrido exitosamente las pruebas, queda mostrado que todas instrucciones de carga y almacenamiento, aritm etico-l ogica, saltos condicionales y otras que se han utilizado en el programa han producido el resultado esperado en forma satisfactoria. En la realizaci on de este trabajo se observ o que las instrucciones lw (load word) y sw (store word) debieron ser usadas con mucha frecuencia; esto es as porque MIPS es una arquitectura estrictamente Load-Store, lo cual implica que los operandos de las instrucciones deben ser registros y no pueden ser direcciones de memoria. Realizar la comparaci on de la convoluci on escrita en C y la misma funci on en c odigo MIPS es un excelente ejemplo para ilustrar el hecho de que por cada sentencia de un lenguaje de alto nivel se necesita una gran cantidad de instrucciones en lenguaje ensamblador para un procesador de arquitectura RISC. Para ejecutar el programa se uni o la funci on de convoluci on escrita en c odigo MIPS con un programa principal escrito en c odigo C. La compilaci on conjunta de ambas partes fue exitosa y funcion o correctamente en la m aquina MIPS emulada. En el makele creado se incluyeron dos opciones para la compilaci on: una con la convoluci on escrita en C, y otra con la convoluci on escrita en c odigo MIPS. Se pudo comprobar as la portabilidad del programa, que funcion o tanto en el Host O.S. como en el Guest O.S. Tambi en se comprueba que el c odigo assembly de MIPS es propio de esa arquitectura, y s olo es u til, obviamente, en la m aquina MIPS.

Referencias
[1] SYSTEM V APPLICATION BINARY INTERFACE MIPS R RISC Processor Supplement 3rd Edition. The Santa Cruz Operation. 1996 [2] http://en.wikipedia.org/wiki/Convolution#Discrete_convolution

6.
6.1.
6.1.1.

Ap endice A: C odigos
C odigo C
dconv.c

1 #include < s t d i o . h> 2 3 extern f l o a t y ; // x s i z e + h s i z e 1 e l e m e n t o s . 4 / 5 C a l c u l a e l p r o d u c t o de c o n v o l u c i o n x [ n ] h [ n ] 6 h t t p : / / en . w i k i p e d i a . o r g / w i k i / C o n v o l u t i o n#D i s c r e t e c o n v o l u t i o n 7 / 8 void 9 conv ( f l o a t x , s i z e t x s i z e , f l o a t h , s i z e t h s i z e ) 10 { 11 12 unsigned i n t i =0, count =0; 13 unsigned i n t m; 14 float f ; 15 16 f o r ( ; i < x s i z e + h s i z e 1; i ++) 17 { 18 f = 0; 19 f o r (m=( i > x s i z e ? i ( x s i z e 1) : i / x s i z e ) ;m <=i && m < h s i z e ;m++) 20 { 21 f += x [ ( i m) % x s i z e ] h [m ] ; 22 } 23 y [ count++] = f ; 24 } 25 }

6.1.2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

main.c
< s t d i o . h> < s t d l i b . h> < g e t o p t . h> < s t r i n g . h> < c t y p e . h> <math . h> < f l o a t . h>

#include #include #include #include #include #include #include

#define BASE INPUT 6 4 ; //Tamanio i n i c i a l d e l s t r i n g para l e e r d e s d e s t d i n ; s i no a l c a n z a s e r e a l o c a memoria # define LIBRE FLT MAX extern void conv ( f l o a t x , s i z e t x s i z e , f l o a t h , s i z e t h s i z e ) ; const char ver num = O r g a n i z a c i o n de Computadoras ( 6 6 . 2 0 ) \nTP 1 1 e r C u a t r i m e s t r e 2010 \nGRUPO 1 \ n V e r s i o n 1 . 0 ; float y ; / Imprime i n f o r m a c i o n s o b r e e l uso d e s d e l i n e a de comandos / void uso ( const char nombre ) { p r i n t f ( Usage : \ n \ t % s h \ n \ t % s V\ n \ t % s [ o p t i o n s ] \ n Options : \ n \ t V, v e r s i o n Imprime l a v e r s i o n y t e r m i n a . \ n \ t h , h e l p Imprime e s t a i n f o r m a c i o n y t e r m i n a . \ n \ t r , r e s p o n s e Nombre d e l a r c h i v o que e s p e c i f i c a h [ n ] . \ n \ t p , p u l s e P u l s o que r e p r e s e n t a h [ n ] e n t r e dos v a l o r e s de n . \ n Examples : \ n \ t % s \ n \ t % s \ t p [ 1 2 ] \ n \ t % s \ t p 8 [ 1 2 ] \ n echo n \ [ 1 . 4 2 . 5 3 . 0 ] \ | % s r r . data \ n \ n , nombre , nombre , nombre , nombre , nombre , nombre , nombre ) ; }

void imprimirNumero ( f l o a t x ) { i f ( f a b s ( x ) <2e 38) p r i n t f ( % i ,0) ; else { i f ( fmod ( x , 1 ) !=0 && fmod( x , 1 ) !=0) p r i n t f ( % g ,x) ; else { i f ( f a b s ( x ) <1e +15) p r i n t f ( %l l i , ( long long i n t ) x ) ; else p r i n t f ( % g ,x) ; } } } / Imprime i n f o r m a c i o n de l a v e r s i o n / void v e r s i o n ( ) { printf ( % s \ n , ver num ) ; } i n t s i z e S t r ( char s ) { i n t i =0;

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

int encontrado = 0 ; while ( ! e n c o n t r a d o ) { i f ( s [ i ]== \ 0 ) encontrado = 1 ; i ++; } return i ; } f l o a t o b t e n e r V e c t o r ( const char s , double mult ) { unsigned long pos = 0 ; int i ; unsigned i nt tam=s t r l e n ( s ) ; i f ( tam < 2) return NULL; // e n t r a d a i n v a l i d a i n t empezoVector =0; i n t f i n =0; char aux=( char ) m a l l o c ( tam+1) ; double m u l t i p l i c a =1; i f ( s [0]== [ ) { memcpy ( aux , s +1 ,tam+1) ; empezoVector =1; i f ( s [1]== ] ) { f r e e ( aux ) ; return NULL; // e n t r a d a i n v a l i d a } } else memcpy ( aux , s , tam+1) ; f l o a t v e c t o r =( f l o a t ) m a l l o c ( s i z e o f ( f l o a t ) tam ) ; //mas de e s o s e g u r o no necesito i n t j =0; f o r ( ; j <tam ; j ++){ v e c t o r [ j ]=LIBRE ; } i n t p o s V e c t o r =0; while ( s i z e S t r ( aux ) >1&&! f i n ) { i n t s z = s i z e S t r ( aux ) ; while ( ( ( pos < s z )&&( i s d i g i t ( ( unsigned char ) aux [ pos ] ) ) ) | | ( aux [ pos]== . ) | | ( aux [ pos]== ) ) { pos++; } i f ( pos > 0) { char strnumero = ( char ) m a l l o c ( pos +1) ; s t r n c p y ( strnumero , aux , pos ) ; strnumero [ pos ]= \ 0 ; double numero = s t r t o d ( strnumero ,NULL) ; f o r ( i =0; i <( sz pos ) ; i ++) aux [ i ]= aux [ i+pos ] ; i f ( empezoVector ) { v e c t o r [ p o s V e c t o r ]=numero ; p o s V e c t o r++; } e l s e m u l t i p l i c a=numero ; f r e e ( strnumero ) ; } aux [ sz pos ]= \ 0 ; pos = 0 ;

112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

// veo s i e l c a r a c t e r que t e n g o e s un o un ] char c a r a c t e r=aux [ 0 ] ; switch ( c a r a c t e r ) { case : // t e n g o en m u l t i p l i c a guardado e l numero que m u l t i p l i c a al vector break ; case [ : empezoVector =1; break ; case ] : f i n =1; break ; } // D e s c a r t o e l c a r a c t e r s z = s i z e S t r ( aux ) ; f o r ( i =0; i <( sz 1) ; i ++) aux [ i ]= aux [ i + 1 ] ; aux [ sz 1]= \ 0 ; } f r e e ( aux ) ; ( mult )=m u l t i p l i c a ; return v e c t o r ; } void r e s p o n s e ( const char h , const char x ) { i n t maxTamX=s t r l e n ( x ) ; i n t maxTamH=s t r l e n ( h ) ; double mult = ( double ) m a l l o c ( s i z e o f ( double ) ) ; f l o a t vecX=o b t e n e r V e c t o r ( x , mult ) ; i f ( vecX==NULL | | vecX [0]==LIBRE) { f p r i n t f ( s t d e r r , Vect or X i n v a l i d o . S a l i e n d o . \ n ) ; f r e e ( mult ) ; return ; } f l o a t vecH=o b t e n e r V e c t o r ( h , mult ) ; i f ( vecH==NULL) { f p r i n t f ( s t d e r r , Vector H i n v a l i d o . S a l i e n d o . \ n ) ; f r e e ( mult ) ; return ; } f r e e ( mult ) ; i n t j =0; s i z e t h s i z e =0, x s i z e =0; f o r ( ; j <maxTamH ; j ++){ i f ( vecH [ j ]==LIBRE) { h s i z e=j ; break ; } } j =0; f o r ( ; j <maxTamX ; j ++){ i f ( vecX [ j ]==LIBRE) { x s i z e=j ; break ; } }

10

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230

y = ( f l o a t ) m a l l o c ( ( h s i z e+x s i z e 1) s i z e o f ( f l o a t ) ) ; conv ( vecX , x s i z e , vecH , h s i z e ) ; printf ( [ ) ; f o r ( j = 0 ; j < x s i z e+h s i z e 1; j ++){ imprimirNumero ( y [ j ] ) ; } p r i n t f ( ] \ n ) ; f r e e ( vecH ) ; f r e e ( vecX ) ; free (y) ; } void p u l s e ( const char h , const char x ) { double mult = ( double ) m a l l o c ( s i z e o f ( double ) ) ; double tmp = ( double ) m a l l o c ( s i z e o f ( double ) ) ; f l o a t vecX = o b t e n e r V e c t o r ( x , tmp ) ; f l o a t tmpH = o b t e n e r V e c t o r ( h , mult ) ; f r e e ( tmp ) ; i f (tmpH==NULL | | tmpH[1]==LIBRE | | tmpH[0] > tmpH [ 1 ] ) { f p r i n t f ( s t d e r r , P u l s o i n v a l i d o . S a l i e n d o . \ n ) ; f r e e ( vecX ) ; f r e e (tmpH) ; f r e e ( mult ) ; return ; } i n t j =0; while ( vecX [ j ] ! = LIBRE) { j ++; } i n t tamX = j ; i n t tamPulso = tmpH[1] tmpH [ 0 ] + 1 ; f l o a t vecH = ( f l o a t ) m a l l o c ( tamPulso s i z e o f ( f l o a t ) ) ; j =0; f o r ( ; j <tamPulso ; j ++) vecH [ j ]=( mult ) ; f r e e ( mult ) ; y = ( f l o a t ) m a l l o c ( ( tamPulso+tamX 1) s i z e o f ( f l o a t ) ) ; conv ( vecX , tamX , vecH , tamPulso ) ; printf ( [ ) ; f o r ( j = 0 ; j <tamX+tamPulso 1; j ++){ imprimirNumero ( y [ j ] ) ; } p r i n t f ( ] \ n ) ; f r e e ( vecH ) ; f r e e ( vecX ) ; free (y) ; } void p r o c e s a r F i l e X ( FILE f i l e X , char x ) { char aux = NULL; i n t tamanio = BASE INPUT ; memset ( x , \ 0 , tamanio ) ; int i = 0 ; char c =0; while ( c !=EOF && c != \ n ) { s t r n c a t ( x,& c , 1 ) ; i ++; i f ( i >=tamanio 1) {

11

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289

aux = ( char ) c a l l o c ( 2 tamanio , s i z e o f ( char ) ) ; memcpy ( aux , x , tamanio 1) ; tamanio = 2 ; free (x) ; x = aux ; aux = NULL; } c=f g e t c ( f i l e X ) ; } } void p r o c e s a r F i l e H ( FILE f i l e H , char h ) { char aux = NULL; i n t tamanio = BASE INPUT ; memset ( h , \ 0 , tamanio ) ; int i = 0 ; char c =0; while ( c !=EOF && c != \ n ) { s t r n c a t ( h,& c , 1 ) ; i ++; i f ( i >=tamanio 1) { aux = ( char ) c a l l o c ( 2 tamanio , s i z e o f ( char ) ) ; memcpy ( aux , h , tamanio 1) ; tamanio = 2 ; free (h) ; h = aux ; aux = NULL; } c=f g e t c ( f i l e H ) ; } } // s i e s r e s p o n s e =0, s e p r o c e s a un p u l s o void p r o c e s a r ( i n t e s r e s p o n s e , const char a r g ) { i n t tamanio = BASE INPUT ; char x = ( char ) m a l l o c ( tamanio ) ; char h = ( char ) m a l l o c ( tamanio ) ; procesarFileX ( stdin , x) ; if ( es response ){ FILE a r c h h ; a r c h h=f o p e n ( arg , r ) ; i f ( arch h ) { procesarFileH ( arch h , h) ; response (h , x) ; f c l o s e ( arch h ) ; } else { f p r i n t f ( s t d e r r , E r r o r : no s e pudo a b r i r e l a r c h i v o % s . , arg ) ; } } else p u l s e ( arg , x ) ; free (x) ; free (h) ; }

i n t main ( i n t argc , char argv ) { int opcion ;

12

290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

const char const o p c i o n e s c o r t a s = hVr : p : ; const struct o p t i o n o p c i o n e s l a r g a s [ ] = { { help , 0, NULL, h } , { v e r s i o n , 0, NULL, V } , { response , 1, NULL, r }, { pulse , 1, NULL, p } }; const char nombre prog = argv [ 0 ] ; const char h=NULL; i n t p r o c e s o p o r =0; while ( 1 ) { opcion = g e t o p t l o n g ( argc , argv , o p c i o n e s c o r t a s , o p c i o n e s l a r g a s ,NULL) ; i f ( o p c i o n == 1) break ; switch ( o p c i o n ) { case h : uso ( nombre prog ) ; return 0 ; case V : version () ; return 0 ; case r : i f ( p r o c e s o p o r ) break ; p r o c e s o p o r =1; h=o p t a r g ; procesar (1 ,h) ; break ; case p : i f ( p r o c e s o p o r ) break ; p r o c e s o p o r =1; h=o p t a r g ; procesar (0 ,h) ; break ; case 1: uso ( nombre prog ) ; break ; default : uso ( nombre prog ) ; break ; } } return 0 ; }

13

6.2.
6.2.1.

C odigo MIPS
dconv.S

1 #i n c l u d e <mips / r e g d e f . h> 2 3 . text 4 . g l o b l conv 5 . ent conv 6 7 conv : . frame $fp , 2 4 , r a 8 #Armado d e l s t a c k 9 subu sp , sp , 24 #Reservo 24 b y t e s en e l s t a c k para l a f u n c i o n 10 sw $fp , 2 0 ( sp ) 11 sw gp , 1 6 ( sp ) 12 move $fp , sp 13 #Guardo l o s argumentos en e l s t a c k de l a f u n c i o n c a l l e r ( por a r r i b a de donde empezo mi s t a c k ) 14 sw a0 , 2 4 ( $ f p ) 15 sw a1 , 2 8 ( $ f p ) 16 sw a2 , 3 2 ( $ f p ) 17 sw a3 , 3 6 ( $ f p ) 18 #Fin de armado d e l s t a c k 19 20 sw zero , 12( $fp ) # i = 0 21 sw zero , 8( $fp ) # count = 0 22 23 f o r 1 : lw t0 , 2 8 ( $ f p ) # t0 = x s i z e 24 lw t1 , 3 6 ( $ f p ) # t1 = h s i z e 25 addu t0 , t0 , t 1 # t0 = x s i z e + h s i z e 26 addi t0 , t0 , 1 # t0 = x s i z e + h s i z e 1 27 lw t3 , 1 2 ( $ f p ) # t3 = i 28 sltu t0 , t3 , t 0 # i < x s i z e + h s i z e 1 29 beq t0 , z e r o , s a l i r # s i no o c u r r e i < x s i z e + h s i z e 1 , t e r m i n a e l loop externo 30 31 #sw t3 , 1 2 ( $ f p ) # a c t u a l i z a r i en e l s t a c k 32 sw zero , 0( $fp ) # f = 0 33 34 lw t0 , 2 8 ( $ f p ) # t0 = x s i z e 35 lw t3 , 1 2 ( $ f p ) 36 sltu t1 , t0 , t 3 # i >x s i z e ? 37 beq t1 , z e r o , condno 38 nop 39 40 # m = i ( x s i z e 1) 41 c o n d s i : lw t0 , 2 8 ( $ f p ) # t0 = x s i z e 42 addi t0 , t0 , 1 # t0 = x s i z e 1 43 lw t3 , 1 2 ( $ f p ) # t3 = i 44 subu t1 , t3 , t 0 # t 1 = i ( x s i z e 1) 45 sw t1 , 4 ( $ f p ) # g u a r d a r t 1 (m) en e l s t a c k 46 b for2 47 48 # m = i / xsize 49 condno : lw t0 , 2 8 ( $ f p ) # t0 = x s i z e 50 lw t3 , 1 2 ( $ f p ) # t3 = i 51 div u t3 , t 0 # lo = i / xsize 52 mf lo t1 # t1 = l o 53 sw t1 , 4 ( $ f p ) # guarda t 1 (m) en e l s t a c k 54

14

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

for2 :

#m <=i && m < h s i z e lw t1 , 4 ( $ f p ) lw t3 , 1 2 ( $ f p ) addiu t3 , t3 , 1 sltu t2 , t1 , t 3 lw t0 , 3 6 ( $ f p ) sltu t0 , t1 , t 0 and t0 , t0 , t 2 beq t0 , z e r o , f i n 1 interno

# # # # # # # #

t1 t3 t3 t2 t0 t0 t0 si

= m = i = i + 1 = m < i +1 ( i . e . m <=i ) = hsize = m < hsize && t 2 no s e cumple l a c o n d i c i o n s a l e d e l f o r

#f += x [ ( i m) % x s i z e ] h [m ] ; lw lw subu lw div u mfhi sll lw addu l.s lw sll lw addu l.s mul . s l.s add . s s.s #a c c i o n lw addiu sw b nop t1 , t3 , t1 , t0 , t1 , t1 t1 , t4 , t4 , $f4 t2 , t2 , t3 , t3 , $f6 $f8 $f4 $f4 $f4 4( $fp ) 12( $fp ) t3 , t 1 28( $fp ) t0 t1 , 2 24( $fp ) t4 , t 1 , 0( t4 ) 4( $fp ) t2 , 2 32( $fp ) t3 , t 2 , 0( t3 ) , $f4 , $f6 , 0( $fp ) , $f4 , $f8 , 0( $fp ) # # # # # # # # # # # # # # # # # # # t1 = m t3 = i t1 = i m t0 = x s i z e hi = ( i m) mod x s i z e t1 = hi t 1 = 4 t 1 ( cada e l e m e n t o ocupa 4 b y t e s ) t 4 = d i r e c c i o n de x t 4 = d i r e c c i o n de x [ ( i m) % xsize ] f4 = x [ ( i m) % xsize ] t2 = m t 2 = 4 t 2 t 3 = d i r e c c i o n de h t 3 = d i r e c c i o n de h [m] f 5 = h [m] f6 = x [ ( i m) % x s i z e ] h [m] f4 = f f4 = f + x [ ( i m) % x s i z e ] h [m ] ; f = f4

f i n a l del for interno t1 , 4 ( $ f p ) # t1 = m t1 , t1 , 1 #m ++ t1 , 4 ( $ f p ) for2

fin1 :

# y [ count++] = f ; lw t0 , y lw t1 , 8 ( $ f p ) sll t2 , t1 , 2 addu t2 , t0 , t 2 l.s $f4 , 0( $fp ) s.s $f4 , 0( t2 ) addi t1 , t1 , 1 sw t1 , 8 ( $ f p )

# # # # # # #

c a r g a l a d i r e c c i o n de y en t 0 t 1 = count t 2 = 4 count t 2 = d i r e c c i o n de y [ count ] f4 = f y [ count ] = f 4 count++

# accion f i n a l del for externo lw t3 , 1 2 ( $ f p ) # t3 = i addiu t3 , t3 , 1 # i++ sw t3 , 1 2 ( $ f p ) b for1 #Desarmado lw $fp lw gp , addu sp , del stack , 2 0 ( sp ) 1 6 ( sp ) sp , 24

salir :

15

114 #Fin de desarmado d e l s t a c k 115 116 j ra 117 . end conv

16

Вам также может понравиться