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