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) ld r10,r30,4 ld r2,r10,0 ;r2 con la dimensión de la matriz. ld r10,r10,8 ;r10 es el puntero a la diagonal. sub r3,r2,1 ;r3 contador de filas a trasponer. DIAGONAL: or r7,r3,r0 ;r7 contador para trasponer 1 fila. or r20,r10,r0 ;r20 puntero a columna a trasponer. ld r11,r10,4 ;r11 puntero a la fila a trasponer. OTRO: or r8,r2,r0 ;Carga el contador rc de SALTA_FIL SALTA_FIL (r20,r8);con n y se inicializa r20. ld r4,r11,0 ;Se realiza el intercambio de ld r5,r20,0 ;elementos que se van a trasponer. st r4,r20,0 st r5,r11,0 ld r11,r11,4 ;Se incrementa el punteros r11 al DBNZ (r7,OTRO) ;siguiente elemento a trasponer. or r8,r2,r0 ;Carga el contador rc de SALTA_FIL SALTA_FIL (r10,r8);con n y se incrementa el puntero ld r10,r10,4 ;r10 a la siguiente diagonal. DBNZ (r3,DIAGONAL) 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