Implementación copos de kosh en ensamblador

Solo disponible en BuenasTareas
  • Páginas : 16 (3854 palabras )
  • Descarga(s) : 0
  • Publicado : 14 de agosto de 2012
Leer documento completo
Vista previa del texto
Universidad de Costa Rica

Escuela de Ciencias de la Computación e Informática

Tarea Programada #2 v1.0
CI-1220 Ensambladores & Microprocesadores

Deivid Calvo Casanova

Para Resolver el problema se consultó las siguientes páginas en internet
http://www.opferman.net
http://temasmatematicos.uniandes.edu.co/Integral_de_Honores/copo_de_nieve/copo_de_nieve.

Además se utilizó elalgoritmo de algoritmo de Bresenham, para dibujar las líneas.
Gran problema encontrado, el procedimiento recursivo, al realizar el “Ret” no se devuelve donde debería, aunque no se tocaba la pila de la recursividad en ningún momento y su construcción estaba bien, entonces Intente hacerlo con Macros, y ahí también tuve otro inconveniente, el macro arrojaba un error de espera de tipo escalar, a lahora de comparar el nivel con 0 para dibujar la línea, lo curioso es que con 0 (cero) funcionaba pero si se enviaba otro número daba el error, la implementación del código fue:

; Nv: Nivel
; L: Largo de la línea
; Coordenas: (x1,y1) (x2,y2)

CurvaKoch Macro Nv,l,Cx1,Cy1,Cx2,Cy2
If Nv eq 0 ; Si N es cero
DibujeLinea Cx1,Cy1,Cx2,Cy2
Else ; Sino se sigue recursivamente buscando lamedida a imprimir
CurvaKoch Nv-1, L/3, Cx1,Cy1,Cx1+l/6,Cy2-l/3
CurvaKoch Nv-1, L/3, Cx2,Cy2,Cx1,Cy2-l/3
CurvaKoch Nv-1, L/3, Cx1,Cy2,Cx2+l/6,Cy1-l/3
CurvaKoch Nv-1, L/3, Cx2,Cy2,Cx2+1/6,Cy2+l/3
EndIf
EndM

; Permite dividir la distancia la línea en tres para hacer una curva de Koch, esta macro es utilizada en el procedimiento recursivo
; para hacer máslegible y pequeño el código recursivo
DibujeLinea Macro Cx1,Cy1,Cx2,Cy2
SetXY Cx1,Cy1,Cx2,Cy2
Call Linea
EndM
CopoKoch Macro
Nv = 1
L = 81
SetXY Cx1,Cy1,Cx2,Cy2
CurvaKoch Nv,L,x1,y1,x2,y1
CurvaKoch Nv,L,x3,y2,x2,y1
CurvaKoch Nv,L,x2,y1,x1,y1
EndM

SetXY Macro Cx1,Cy1,Cx2,Cy2
Mov Ax, Cx1
Mov word ptr TempX, Ax
Mov Ax, Cy1
Mov word ptr TempY, Ax
Mov Ax, Cx2Mov word ptr TempX2, Ax
Mov Ax, Cy2
Mov word ptr TempY2, Ax
EndM
;********************************************************************************
LKoch Proc ;Estructura para mantener la recursividad
Push BP
Mov BP, SP
Mov Ax, [BP].N
Cmp Ax, 0; Comparamos el elemento en la pila para determinar si es cero, si lo es se dibuja una línea
Je IrD_Linea
Dec AxPush Ax
Call Tercio_Distancia
Call CalculaXY
Call LKoch ; 1er línea
Call CalculaXY2 ; Calcular coordenadas
Call LKoch ; 2da línea
Call CalculaXY3 ; Calcular coordenadas
Call LKoch ; 3er línea
Call CalculaXY4 ; Calcular coordenadas
Call LKoch ; 4ta línea
Jmp SalirLKoch
IrD_Linea:
Call Linea
SalirLKoch:
Pop BP
Ret

LKoch EndP

ELcódigo que desifra el programa es el siguiente

.286
; Referencias: http://www.opferman.net/Text/prim.txt
; Referencias: http://temasmatematicos.uniandes.edu.co/Integral_de_Honores/copo_de_nieve/copo_de_nieve.htm;

; Macro que permite recibir 4 coordenadas y colocarlas en las variables Temporales que moveran las líneas en la pantalla
SetXY Macro Cx1,Cy1,Cx2,Cy2
Mov Ax, Cx1
Mov word ptrTempX, Ax
Mov Ax, Cy1
Mov word ptr TempY, Ax
Mov Ax, Cx2
Mov word ptr TempX2, Ax
Mov Ax, Cy2
Mov word ptr TempY2, Ax
EndM

datos segment
; Variables Temporales utilizadas para redefinir las cordenadas a la hora de dibujar el copo de koch
TempX DW 0
TempY DW 0
TempX2 DW 0
TempY2 DW 0
; Variables para el algoritmo de Bresenham, que permite dibujarlineas con base a las medidas originales
DeltaX DW 0 ; Guarda la trayectoria de X (de x1 a x2)
DeltaY DW 0 ; Guarda la trayectoria de y (de y1 a y2)
Y_INC DW 0 ; Permite hacer incrementos o decrementos a Y para ajustar con X
X_INC DW 0 ; Permite hacer incrementos o decrementos a X para ajustar con Y
Error DW 0 ; Permite guardar la diferencia entre las coordenas X,Y y...
tracking img