Ensamblador - circulo en masm 611

   
Vista:

circulo en masm 611

Publicado por Joel (1 intervención) el 29/11/2009 01:48:34
Hola!!!
Me gustaria saber como hago un circulo en masm 611, porque me dicen que lo tengo que hacer con 4 bucles y con un pixel en el centro pero no se como, ya me confundi en como hacerlo, por fa necesito que me ayuden gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:circulo en masm 611

Publicado por PercevalCiro (1 intervención) el 04/04/2010 23:10:43
Si, es el algoritmo del punto medio.
Yo hice esto, pero tenes que pasar los valores como se indica en la
descripcion y despues hacer un call dibujar_circulo. Esto esta en tasm. Para MASM Proc dibujar_circulo. E incluso podes poner ahi mismo los parametros.
;------------------------------------------------------------------------
;
;valores de entrada
;yc = dl |||||||||||||||||||||||||||| Altura...
;xc = dh <--------------------------> Posicion Horizontal.
;r = cl <-valor necesario
;Color = ch <-No habilitada.
;------------------------------------------------------------------------
dibujar_circulo:
pusha
push dx ;Se resguarda el valor.
;mov al, r
;mov y0, al
;Aqui CH Toma el valor de x0, que comienza en cero.
;Y CL toma el valor que pasaron como radio. Que es y0
mov ch, 0 ;ch = x0(0) cl = y0(cl)
;Para no hacer varias veces la operacion Si, pasara en
;primer lugar el valor de Yc a SI, multiplicado por 320d
xor ax, ax ;Se limpia el reg.
mov al, dl ;se pasa el valor de dl. YC
mov bx, 0140h ;Se coloca el valor 132
mul bx ;se realiza la multiplicacion.
mov si, ax ;El resultado se guarda en si.
pop bx ;se recupera DX xc - yc DB
xchg bl, bh ;se invierte.
mov bh, 0 ;Se limpia el reg superior de Bx
mov dl, 1 ;se obtendra h-> 1 - r
sub dl, cl ;se resta y el valor queda en dl.
mov dh, 0 ;se deja vacio dh.


bucle: ;Mientras y0>x0
cmp ch, cl ;si y0>x0(x0)
jg cfin ;salta a fin

;pintar_circulo(x0,y0)
call pintapixel
;Si h<0
cmp dl,0 ;si h<0 dl<0
jg aelse ;salta a else
push ax
push bx
push cx
push dx
;-----------------------------------------------------------------------
;h = h+2x0+1
xor ax,ax
xor bx,bx

mov al, ch ;Se mueve el valor que contiene x0.
mov bl, 2 ;Se indica que la operacion se hara por 2
mul bl ;Se dispara la multiplicacion ya se hizo 2 x X0
inc al ;El resultado de 2 x X0 se incrementa en una unidad


;------------------------------------------------------------------------
pop dx
add dl, al ;pasamos el resultado del registro AL sumando a la variable H
pop cx
pop bx
pop ax
jmp continua;Se continua con el bucle.
;sino
aelse:

push ax
push bx
push cx
push dx
;-----------------------------------------------------------------------
;h = h+2x0-2y0+1
;y = y-1
xor ax, ax
xor bx, bx
xor dh, dh

mov al, cl ;Se hara 2 x Y0.
mov bl, 2
mul bl
mov dl, al ;Se almacena en un buffer.

xor ax, ax ;se limpia AX

mov al, ch ;se hara ahora X0 x 2
mul bl
sub al, dl ;Se realiza la resta 2.x0 - 2.y0
;+1
inc al ;se incrementa en uno.
;h+

;y = y-1


;------------------------------------------------------------------------
pop dx
add dl, al ;se agrega a H el resultado.
pop cx
dec cl ;se decrementa en una unidad.
pop bx
pop ax
;finsi
continua:
;x0 = x0+1
inc ch ;Se incrementa x0
jmp bucle
;finmientras
cfin:
popa
ret

;-------------------------------------------------------------
;macro para imprimir los pixeles en pantalla, hay que
;realizar las siguientes formulas
;xc + x0 . yc + y0
;xc - x0 . yc + y0
;xc + x0 . yc - y0
;xc - x0 . yc - y0
;xc + y0 . yc + x0
;xc - y0 . yc + x0
;xc + y0 . yc - x0
;xc - y0 . yc - x0
;Y con esas coordenadas imprimir un pixel, para eso esta la
;macro pintarpixel, que ademas asigna los valores iniciales
;a bx, con xc y yc.
;-------------------------------------------------------------
pintapixel:
push ax
push bx
push cx
push dx
push ds

;--------Apuntamos a la memoria.-----------------
mov ax, 0A000h
mov ds, ax
;--------comienzan los calculos necesarios.------
xor ax,ax
mov dx, 0140h
mov al, cl
mov ah, 0
mul dx ;640+247
push ax
mov dx, 0140h
mov al, ch
mov ah, 0
mul dx
pop dx

;BX= XC SI= YC AX = x0*320 DX = y0*320
; CH = x0 cl = y0
;------------------------;
push cx
mov cl, 0
xchg ch,cl
@@punto1:
;SI =
;BX =
;si + cxh | bx + dx (YC+x0) (XC+
add si, cx
add bx, dx
mov byte ptr[si+bx], 0011b
sub si, cx
;SI=
;BX+
@@punto2:
;SI=
;BX+
;si - cxh | bx + dx
sub si, cx
mov byte ptr[si+bx], 0011b
sub bx, dx
;SI-
;BX=
@@punto3:
;SI-
;BX=
;si - cxh | bx - dx
sub bx, dx
mov byte ptr[si+bx],0011b
add si, cx
;SI=
;BX-
@@punto4:
;SI=
;BX-
;si + cxh | bx - dx
add si, cx
mov byte ptr[si+bx],0011b
add bx, dx
sub si, cx
;SI=
;BX=

;------------------------;
pop cx
mov ch, 0
@@punto5:
;SI =
;BX =
;si + cxl | bx + ax
add si, cx
add bx, ax
mov byte ptr[si+bx], 0011b
sub si, cx
;SI=
;BX+
@@punto6:
;SI=
;BX+
;si - cxl | bx + ax
sub si, cx
mov byte ptr[si+bx], 0011b
sub bx, ax
;SI-
;BX=
@@punto7:
;SI-
;BX=
;si - cxl | bx - ax
sub bx, ax
mov byte ptr[si+bx],0011b
add si, cx
;SI=
;BX-
@@punto8:
;SI=
;BX-
;si + cxl | bx - ax
add si, cx
mov byte ptr[si+bx],0011b
add bx, ax
sub si, cx
;SI=
;BX=
pop ds
pop dx
pop cx
pop bx
pop ax
ret
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PercevalCiro NECESITO TU AYUDA

Publicado por HECTOR REYES (2 intervenciones) el 24/05/2010 05:59:10
HOLA XFAVOR NESECITO SU AYUDA PARA CREAR UN CIRCULO EN CODIGO ASSEMBLER
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar