用汇编语言编程

用汇编编一个画圆的程序,在EMU8086上运行的,
编一个具体的程序,能运行之后就直接能画出圆的
还有最好就是把编程序所用的数据单独写出来一下,标明什么是什么

写一下简单的算法吧,
先提供一个简单的画点子程序:
;在屏幕显示一点或一像素子程序
;输入参数:
; 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

仅供参考, 没有经过测试,
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-10-28
关键是算法,你自己把它翻译成Asm吧:
// Bresenham 画圆算法基本例程
void b_circle(int x0,int y0,int r,char color)
{
register int x,y,increment;
int startx,endx,starty,endy,i;

y=r;
increment=3-2*r;
for(x=0;x<y;)
{
startx=x;endx=x+1;
starty=y;endy=y+1;
for(i=startx;i<endx;++i)
{point(x0+i,y0+y,color); // 画点函数
point(x0+i,y0-y,color);
point(x0-i,y0-y,color);
point(x0-i,y0+y,color);
}
for(i=starty;i<endy;++i)
{point(x0+i,y0+x,color);
point(x0+i,y0-x,color);
point(x0-i,y0-x,color);
point(x0-i,y0+x,color);
}
if(increment<0) increment+=4*x+6;
else {increment+=4*(x-y)+10;y--;}
x++;
}

x=y;
if(y)
{startx=x;endx=x+1;
starty=y;endy=y+1;
for(i=startx;i<endx;++i)
{point(x0+i,y0+y,color);
point(x0+i,y0-y,color);
point(x0-i,y0-y,color);
point(x0-i,y0+y,color);
}
for(i=starty;i<endy;++i)
{point(x0+i,y0+x,color);
point(x0+i,y0-x,color);
point(x0-i,y0-x,color);
point(x0-i,y0+x,color);
}
}
}
第2个回答  2008-10-28
算法还不简单吗
用BIOS 的INT 10H 中断中的话像素的方法实现。
确定某一行某一列的点位圆形,然后一个循环,把所有于圆心距离相等的点都描出来就是一个圆了,逐行扫描,每行应该最多有两个点符合要求。
第3个回答  2008-10-29
热闹,分类达人前三全来了,我也进来LOOK一下。

就是啥都看不懂
第4个回答  2008-11-01
请注明引用网址
第5个回答  2008-10-28
关键是算法,你自己把它翻译成Asm吧:
相似回答