PUSH: MACRO(ra) subu r30,r30,4 st ra,r30,0 ENDMACRO POP: MACRO(ra) ld ra,r30,0 addu r30,r30,4 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 STR2INT: PUSH (r1) ld r10,r30,4 ;Carga parámetro 1 (dirstr). xor r29,r29,r29 ;Puesta a cero del acumulador. S1: ld.bu r11,r10,r0 ;Carga un carácter y addu r10,r10,1 ;actualiza puntero al siguiente. cmp r5,r11,0x30 ;Comprueba si está entre 0 y 9, bb1 lt,r5,SFIN ;si es menor que 0x30 tiene que subu r5,r11,0x30 ;ser 0x2D, fin de la cadena. mulu r29,r29,10 ;Multiplica por 10 el acumulador addu r29,r29,r5 ;y le suma el valor del br S1 ;nuevo carácter. SFIN: st r10,r30,4 ;Devuelve el puntero actualizado. POP (r1) jmp (r1) QS: PUSH (r1) ;No es necesario usar marco de pila. ld r10,r30,4 ;Carga parámetro 1 (vect). ld r11,r30,8 ;Carga parámetro 2 (n_pri). ld r12,r30,12 ;Carga parámetro 3 (n_ult). mulu r5,r12,4 ;Cada elemento es 1 palabra (4 Bytes). addu r25,r10,r5 ;Dir de vect[n_ult]. QS1: ld r13,r25,r0 ;v = vect[n_ult]. subu r14,r11,1 ;i=n_pri-1. addu r15,r12,r0 ;j=n_ult. QS2: cmp r5,r12,r11 ;Si n_ult<=n_pri ir a FIN. bb1 le,r5,QS10 QS3: addu r14,r14,1 mulu r5,r14,4 addu r4,r10,r5 ;Dir(vect[i]). ld r24,r4,r0 ;vect[i]. cmp r5,r24,r13 ;Si vect[i]>=vect[n_ult] continuar. bb1 hs,r5,QS4 cmp r5,r14,r12 ;Si i0, pasar al anterior. bb1 hi,r5,QS4 QS5: cmp r5,r14,r15 ;Si i>=j, finalizar este paso. bb1 hs,r5,QS7 QS6: st r24,r3,r0 ;Intercambia vect[i] por vect[j]. st r23,r4,r0 br QS3 QS7: st r13,r4,r0 ;Intercambia vect[n_ult] por vect[i]. st r24,r25,r0 PUSH (r12) ;Se guarda el valor de n_ult. PUSH (r14) ;Se guarda el valor de i. subu r14,r14,1 QS8: PUSH (r14) ;Valor de i-1, parámetro de QS (ult). PUSH (r11) ;Valor de n_pri, parámetro de QS (pri). PUSH (r10) ;Vector, parámetro de QS. bsr QS addu r30,r30,12 POP (r14) ;Recupera valor de i. POP (r12) ;Recupera valor de n_ult. addu r14,r14, 1 QS9: PUSH (r12) ;valor de n_ult, parámetro de QS (ult). PUSH (r14) ;valor de i+1, parámetro de QS (pri). PUSH (r10) ;vector, parámetro de QS. bsr QS addu r30,r30,12 QS10: POP (r1) jmp (r1) PPAL: LEA (r30,PILA) ;Inicialización (Puntero de Pila). LEA (r10,LISTA) ;Inicialización variables. LEA (r20,RESUL) xor r15,r15,r15 ;Contador de caracteres. PPAL1: ld.bu r29,r10,r0 ;Comprueba si ha terminado. cmp r5,r29,0 bb1 eq,r5,PPAL2 PUSH (r10) ;Paso del parámetro de STR2INT. bsr STR2INT POP (r10) ;Recuperación del puntero a LISTA addu r15,r15,1 ;actualizado y actualización del st r29,r20,r0 ;contador de caracteres. addu r20,r20,4 ;Actualización del puntero a RESUL. br PPAL1 PPAL2: LEA (r21,NUM) ;Almacenamiento del número de DNIs st r15,r21,r0 ;procesados. LEA (r10,RESUL) ;Prepara la dirección de la lista subu r15,r15,1 ;a ordenar. PUSH (r15) ;Paso de parámetros de QS. PUSH (r0) PUSH (r10) bsr QS addu r30,r30,12 ;Recuperación del puntero de pila. stop org 10000 LISTA: data "1234-7654321-9876543-56789-555\0" NUM: res 4 RESUL: res 800 org 60000 PILA: res 100