Ordenar un polinomio por el método Bubble Sort en ensamblador

Para obtener una descripción detallada del método de ordenación de burbuja (Bubble Sort) visitar http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja




La actividad propuesta era la ordenación de un polinomio en función del exponente por el método de burbuja de mayor a menor.

Las consideraciones son:
  • El polinomio será de una sola variable (x) y estarán representados por dos vectores de 20 posiciones.  
  • Los coeficientes de cada término del polinomio serán valores enteros diferentes de 0 
  • Los exponentes de cada término del polinomio serán valores enteros positivos.
  • Solamente se representarán los términos del polinomio con un coeficiente diferente de 0. 
  • El polinomio no puede tener dos términos con el mismo exponente.

El polinomio a ordenar

p(x) = x^37 +3x^11 -2x^9 +5x^8 +2x -1

             (índice)      0        1       2       3       4       5       6      7      ...    19
                        *****************************************************************     ********
              v_coef = * +1     * +3    * -2    * +5    * +2    * -1    *   0 *    0   * ... * 0 *
                        *****************************************************************     ********
              v_exp = * +37 * +11 * +9          * +8    * +1    * +0    * -1 * -1      * ... * -1 *
                        *****************************************************************     ********
              p(x)    = (+x^37)+(+3x^11)+(-2x^9)+(+5x^8)+( +2x )+( -1 )


Código ensamblador


p_bubbleSort:                      ; nombre del procedimiento de ordenación

          push rbp
          mov  rbp, rsp
        
          push rax            ; guardar en la pila los registros de 64 bits que se
          push rbx            ; modifiquen en el procedimiento para dejar todos
          push rcx            ; los registros como estaban antes de salir.
          push rdx
          push rsi
          push rdi
          push r8
          push r9  

          ; en las operaciones se usan registros 32 bits para verlo mas claro

          xor  esi, esi       ; se usan los registros esi y edi como contadores
          xor  edi, edi           
          ; se inicializa no con la instrucción mov esi, 0
          ; sino con la operación xor por ser más efectivo esta instruccion
          mov  ebx, r_exp     ; almacenar en ebx exponentes del polinomio r(x)
          mov  r8d, r_coef    ; almacenar en r8d coeficientes del polinomio r(x)
          
          p_bubble_sort_loop1:
            mov edx, [ebx + esi * 4]    ; vector de exponentes
            mov r9d, [r8d + esi * 4]    ; vector de coeficientes
            mov edi, esi
            inc edi                     ; ordenamos a partir de la posición siguiente.

          p_bubble_sort_loop2:
            cmp [ebx + edi * 4], edx
            jle p_bubble_sort_no_xchg
            p_bubble_sort_xchg:

          xchg edx, [ebx + edi * 4]     ; vector de exponentes
          xchg r9d, [r8d + edi * 4]     ; vector de coeficientes

          p_bubble_sort_no_xchg:
          inc edi
          cmp edi,20
          jl  p_bubble_sort_loop2
             
          mov [ebx + esi * 4], edx     ; vector de exponentes
          mov [r8d + esi * 4], r9d     ; vector de exponentes
          inc esi
          cmp esi, 19
          jl  p_bubble_sort_loop1 
 
          p_bubble_sort_end:

          pop rdi          ; restaurar el estado de los registros
          pop rsi          ; usados en el procedimiento
          pop rdx          ; y devolver el estado que tenian antes de entrar
          pop rcx          ; a p_bubbleSort: 
          pop rbx
          pop rax
          pop r8
          pop r9
          mov rsp, rbp
          pop rbp
      ret                 ; volver a la ejecución principal

No hay comentarios:

Publicar un comentario