写一下简单的算法吧,
先提供一个简单的画点子程序:
;在屏幕显示一点或一像素子程序
;输入参数:
; BX = 行地址(0-479)
; SI = 列地址(0-639)
; DL = 颜色 (0-15)
; 640*480显示模式
DOT proc near
push cx ;保存颜色
push dx
mov ax, 80 ;行地址
mul bx
mov di, ax ;保存行地址
mov ax, si ;计算列地址
mov dh, 8
div dh
mov cl, ah ;得到移位数值
mov ah, 0
add di, ax ;构成像素地址
mov al, 80h
shr al, cl ;计算相应位屏蔽寄存器中的位
push ax ;保存位屏蔽字
mov dx, 3ceh ;图形地址寄存器
mov al, 8 ;选择位屏蔽寄存器
out dx, al
mov dx, 3cfh ;位屏蔽寄存器
pop ax ;得到位屏蔽寄存器
out dx, al
mov dx, 3c4h ;顺序地址寄存器
mov al, 2 ;选择映象屏蔽寄存器
out dx, al
mov dx, 3c5h ;映象屏蔽寄存器
mov al, 0fh ;使所有位平面均有效
out dx, al
mov al, es:[di] ;先读
mov byte ptr es:[di], 0 ;清除原有颜色
pop ax ;从栈中恢复颜色
push ax
out dx, al
mov byte ptr es:[di], 0ffh ;写内存
pop dx ;返回
pop cx
ret
DOT endp
到时可以用MACRO来调用,比如:
SetPixel MACRO x, y, color
mov bx, x
mov si, y
mov dl, color
call DOT
ENDM
调用时用 SetPixel x, y, color就可以了,color值为0-15
当然如果你用API的话,就更简单了, 直接invoke SetPixel x, y, color就可以了..
这里提供的是对显存和内存操作的SetPixel
在主程序中要先做下列初始化:
mov ax, 0a000h ;显存地址
mov es, ax
cld ;递增
mov ax, 12h ;设置显示模式为12h
int 10h ;清屏
----------------------------------------------------------------------------
然后提供一个画图算法, 我用宏汇编写的:
BrshEllipse xo, yo, r
mov xi, 0
mov yi, r ;这里xi, yi是每次画点的坐标
mov delta, 2*(1-r)
.while yi >= 1
SetPixel xo + xi, yo + yi, color
.if delta < 0
mov delta1, 2*delta+2*yi - 1
.if delta1 <= 0
inc xi
mov delta, delta+2*xi + 1
.else
inc xi
dec yi
mov delta, delta+2*xi-2*yi + 2
.endif
.elseif delta > 0
mov delta1, 2*delta - 2*xi - 1
.if delta1 <=0
inc xi
dec yi
mov delta, delta+2*xi-2*yi + 2
.else
dec yi
mov delta, delta-2*yi + 1
.else
inc xi
dec yi
mov delta, delta + 2*xi - 2*yi + 2
.endif
.endw
仅供参考, 没有经过测试,
温馨提示:答案为网友推荐,仅供参考