PUSH: MACRO(ra) subu r30,r30,4 st ra,r30,0 ENDMACRO POP: MACRO(ra) ld ra,r30,0 addu r30,r30,4 ENDMACRO DBNZ: MACRO(ra,eti) sub ra,ra,1 ;Decrementa el registro ra cmp r4,ra,0 ;y salta a eti si no es cero. bb0 eq,r4,eti ENDMACRO LEA: MACRO (ra, eti) ;Carga el registro ra con el or ra, r0, low(eti) ;valor de la etiqueta eti. or.u ra,ra,high(eti) ENDMACRO SALTA_FIL: MACRO(rp,rc) ld rp,rp,4 ;Se carga rp con el puntero al sub rc,rc,1 ;siguiente elemento de la lista cmp r4,rc,0 ;y se decrementa el contador. bb0 eq,r4,-3 ENDMACRO CONVER: PUSH (r1) ld r20,r30,4 ;r20 es el puntero a Resultado. ld r10,r30,8 ;r10 es el puntero a Matriz. ld r2,r10,0 ;r2 contiene el número de filas ld r3,r10,4 ;y r3 el número de columnas. ld r10,r10,8 ;r10 apunta al elemento de Matriz. st r2,r20,0 ;Se cargan filas y columnas st r3,r20,4 ;en Resultado. addu r20,r20,8 SIGUE: ld r4,r10,0 ;Se almacena el elemento de Matriz st r4,r20,0 ;en Resultado y addu r20,r20,4 ;se incrementa el puntero. ld r10,r10,4 ;Se carga el puntero a Matriz con cmp r4,r10,0 ;la dirección del siguiente bb0 eq,r4,SIGUE ;elemento y si es NULL POP (r1) ;se ha terminado. jmp (r1) TRASPON: PUSH (r1) PUSH (r31) or r31,r30,r0 ld r10,r31,8 ;r10 el puntero a matriz encadenada. ld r2,r10,0 ;r2 con la dimensión de la matriz. mulu r4,r2,r2 ;Reserva espacio en marco de pila add r4,r4,2 ;para almacenar la matriz como una mulu r4,r4,4 ;matriz convencional por filas. subu r30,r30,r4 or r20,r30,r0 ;r20 es el puntero al resultado de PUSH (r2) ;CONVER. Se salvaguarda el registro PUSH (r10) ;r2 y se pasan los parámetros PUSH (r20) ;a CONVER. bsr CONVER POP (r20) ;Se recupera el contenido POP (r10) ;de los registros. POP (r2) addu r20,r20,8 ;Los punteros de las matrices se ld r10,r10,8 ;ponen apuntando al primer elemento. mulu r22,r2,4 ;r22=4*n para saltar al siguiente or r3,r2,r0 ;elemento de la columna, r3 contador S_COL: or r5,r2,r0 ;de columnas y r5 contador de filas. or r21,r20,r0 ;r21 es el puntero para recorrer la S_FIL: ld r4,r21,0 ;columna. Se carga una columna de la st r4,r10,0 ;matriz almacenada en la pila como addu r21,r21,r22 ;una fila de la atriz original. ld r10,r10,4 DBNZ (r5,S_FIL) addu r20,r20,4 ;Se pasa a la siguiente columna de DBNZ (r3,S_COL) ;la matriz almacenada en la pila. or r30,r31,r0 POP (r31) POP (r1) jmp (r1) ;Programa llamante para probar la rutina CONVER. LL_CONV: addu r30,r0,60008 LEA (r2,MATRIZ) PUSH (r2) LEA (r2,RESULTADO) PUSH (r2) bsr CONVER stop ;Programa para probar la macro SALTA_FIL. PR_MACRO: addu r2,r0,10000 addu r3,r0,3 SALTA_FIL (r2,r3) stop ;Programa llamante para probar la rutina TRASPON empleando ;la macro SALTA_FIL. LL_TRAS: addu r30,r0,60004 LEA (r2,MATRIZ) PUSH (r2) bsr TRASPON stop org 5000 MATRIZ: data 3, 3, 10000 org 6000 RESULTADO: res 200 org 10000 data 1, 10016, -1, -1 data 7, 10032, -1, -1 data 9, 10048, -1, -1 data 4, 10064, -1, -1 data 2, 10080, -1, -1 data 6, 10096, -1, -1 data 5, 10112, -1, -1 data 5, 10128, -1, -1 data 3, 00000, -1, -1