PUSH: MACRO(ra) subu r30,r30,4 st ra,r30,0 ENDMACRO POP: MACRO(ra) ld ra,r30,0 addu r30,r30,4 ENDMACRO org 10000 MINIMO: PUSH (r1) ld r20,r30,4 ;Dirección de la lista. ld r21,r30,8 ;Dirección del elemento. or r29,r21,r21 ;Dirección del minimo (inicialmente es el ;que se pasa como parámetro). ld r22,r29,8 ;Valor del mínimo. or r23,r21,r21 ;Dirección del elemento que se ha de BUC_MIN: ;comparar con el mínimo. ;Primero se comprueba si se ha sobrepasado el último ;elemento, es decir, si la dirección del elemento ;actual coincide con la de la cabecera de la lista, cmp r4,r23,r20 ;si es así, ya se ha comparado el último bb1 2,r4,FIN_MIN ;con el mínimo y se ha terminado. ld r24,r23,8 ;Se carga el valor del elemento en cmp r4,r24,r22 ;consideración y se compara con el mínimo ;obtenido hasta ahora, si no es menor bb0 10,r4,NO_MENOR ;se pasa al siguiente y si lo es se or r22,r24,r24 ;actualiza el mínimo y también se prepara or r29,r23,r23 ;el resultado de la función. NO_MENOR: ld r23,r23,0 ;En cualquier caso, se pasa al siguiente br BUC_MIN ;elemento. FIN_MIN: ;Se recupera el valor de retorno (en realidad no ;haría falta el PUSH-POP de r1, ;ya que no se modifica su valor en la función). POP (r1) jmp (r1) ;Retorno al llamante. INTERCAMBIO: PUSH (r1) ld r20,r30,4 ;Dir Lista. ld r21,r30,8 ;Dir Elemento 1 (E1). ld r22,r30,12 ;Dir Elemento 2 (E2). cmp r4,r21,r22 ;Si E1=E2 entonces finaliza el bb1 2,r4,FIN_IC ;intercambio (no hay nada que hacer). ld r23,r21,0 ;Dir Siguiente a Elemento1 (SE1). ld r24,r22,0 ;Dir Siguiente a Elemento2 (SE2). ld r25,r21,4 ;Dir Anterior a Elemento1 (AE1). ld r26,r22,4 ;Dir Anterior a Elemento2 (AE2). cmp r4,r23,r22 ;Si son consecutivos, E1_SEG_E2, es un bb1 2,r4,E1_SEG_E2 ;caso especial y lo trata aparte. cmp r4,r24,r21 ;Consecutivos al contrario, E2_SEG_E1, bb1 2,r4,E2_SEG_E1 ;lo trata aparte ;Caso general st r22,r25,0 ;Actualiza Sig. de Ant. de E1: S(A(E1))=E2 st r21,r26,0 ;Actualiza Sig. de Ant. de E2: S(A(E2))=E1 st r22,r23,4 ;Actualiza Ant. de Sig. de E1: A(S(E1))=E2 st r21,r24,4 ;Actualiza Ant. de Sig. de E2: A(S(E2))=E1 st r24,r21,0 ;Nuevo valor de Dir-Sig-E1. S(E1) = S(E2) st r23,r22,0 ;Nuevo valor de Dir-Sig-E2. S(E2) = S(E1) st r26,r21,4 ;Nuevo valor de Dir-Ant-E1. A(E1) = A(E2) st r25,r22,4 ;Nuevo valor de Dir-Ant-E2. A(E2) = A(E1) br FIN_IC E1_SEG_E2: ; Caso en que E1 iba seguido de E2 st r22,r25,0 ;Actualiza Sig. de Ant. de E1: S(A(E1))=E2 st r21,r24,4 ;Actualiza Ant. de Sig. de E2: A(S(E2))=E1 st r24,r21,0 ;Nuevo valor de Dir-Sig-E1. S(E1) = S(E2) st r21,r22,0 ;Nuevo valor de Dir-Sig-E2. S(E2) = E1 st r22,r21,4 ;Nuevo valor de Dir-Ant-E1. A(E1) = E2 st r25,r22,4 ;Nuevo valor de Dir-Ant-E2. A(E2) = A(E1) br FIN_IC E2_SEG_E1: ;Caso en que E2 iba seguido de E1 st r21,r26,0 ;Actualiza Sig. de Ant. de E2: S(A(E2))=E1 st r22,r23,4 ;Actualiza Ant. de Sig. de E1: A(S(E1))=E2 st r22,r21,0 ;Nuevo valor de Dir-Sig-E1. S(E1) = E2 st r23,r22,0 ;Nuevo valor de Dir-Sig-E2. S(E2) = S(E1) st r26,r21,4 ;Nuevo valor de Dir-Ant-E1. A(E1) = A(E2) st r21,r22,4 ;Nuevo valor de Dir-Ant-E2. A(E2) = E1 FIN_IC: POP (r1) jmp (r1) ;Retorno al llamante ;Fin de la función INTERCAMBIO ORDENA: PUSH (r1) ld r10,r30,4 ;Dir Lista. ld r11,r10,0 ;Dir del elemento en curso (inicialmente ;el primero de la lista). OTRO_ELEM: cmp r4,r11,r10 ;Se compara si el elemento en curso es la bb1 2,r4,FIN_ORD ;cabecera. Si lo es ya está terminada la ld r12,r11,0 ;ordenación. Reserva la dirección del ;siguiente y llama a MINIMO. PUSH (r11) ;Argumento 2 de MINIMO (Dir_Elemento). PUSH (r10) ;Argumento 1 de MINIMO (Dir_Lista). bsr MINIMO ;Llamada a MINIMO. addu r30,r30,8 ;Recuperación del puntero de pila ;y llamada a INTERCAMBIO. PUSH (r29) ;Argumento 3 (Dir_Elemento_2). PUSH (r11) ;Argumento 2 (Dir_Elemento_1). PUSH (r10) ;Argumento 1 (Dir_Lista). bsr INTERCAMBIO ;Llamada a INTERCAMBIO. addu r30,r30,12 ;Recuperación del puntero de pila ;y se accede al siguiente elemento. or r11,r12,r12 ;Lleva a Dir_Elemento la dirección del br OTRO_ELEM ;siguiente. FIN_ORD: POP (r1) ;La ordenación ha finalizado. jmp (r1) LL_ORD: addu r30,r0,60004 ;add r2,r0,1000 ;PUSH (r2) add r2,r0,100 PUSH (r2) bsr ORDENA stop org 100 data 2000, 1200, 4 org 1000 data 1100, 2000, 10 org 1100 data 1200, 1000, 8 org 1200 data 100, 1100, 2 org 2000 data 1000, 100, 9