不晓得为啥我们学的汇编和别人家的汇编不一样,是link xxx /tiny的,直接出可运行的.com文件,所以网上很多五角星程序用不了。。。
没办法自己写了个交作业。
图形模式计算点坐标太难了,于是自己拿画图画了一个像素五角星,给它变成了行和列的相对坐标,存缓冲区里,用xlat查表来简化代码,免得都是重复画点代码又臭又长。。。
.model tiny
.code
.startup
mov ah,0FH
int 10H ;保存原显示模式
mov before,ax
mov al,0DH
mov ah,0
int 10H ;设置为彩色图形模式
mov bh,0
mov bl,0
mov ah,0BH ;黑色调色板
int 10H
fillc: mov dx,0C8H
mov ah,0CH
mov al,red ;填充背景颜色为红色
folp: dec dx
mov cx,13FH
filp: int 10H
dec cx
cmp cx,0
jnl filp
cmp dx,0
jnz folp
mov b,bh ;保存好bh的值
mov x,18H
mov y,18H
call draws ;在给定位置绘制五角星
mov x,10H
mov y,6FH
call draws
mov x,30H
mov y,58H
call draws
mov x,50H
mov y,38H
call draws
mov x,60H
mov y,0FH
call draws
mov ah,01H
int 21H
mov ax,before ;恢复原显示方式后结束
mov ah,0
int 10H
mov ah,4CH
int 21H
.exit 0
before dw ?
b db ?
x dw ?
y dw ?
red equ 4
yellow equ 0EH
start db 10,-1,-2,-3,-4,-5,-6,-13,-18,-15,-11,-9,-10,-11,-12,-13,-14 ;绘制五角星所需参数
fill db 1,1,3,3,5,5,7,19,17,13,9,9,11,11,13,13,15
cnts equ $-fill
starta db 9,-4,-7,-10
filla db 3,5,9,11
cnta equ $-filla
i db ?
draws proc
mov dx,x ;首先绘制外形
mov cx,y
mov i,0
dolp: mov bx,offset start
mov al,i
xlat
mov ah,0
add cx,ax
and cx,0FFH
mov ah,0CH
mov bx,offset fill
mov al,i
xlat
mov bl,al
mov al,yellow ;填充星星颜色为黄色
dilp: mov bh,b
int 10H
inc cx
dec bl
cmp bl,0
jnz dilp
inc dx
mov al,i
inc al
mov i,al
cmp al,cnts
jnz dolp
mov dx,x ;在中间挖出一个三角形
add dx,13
mov cx,y
mov i,0
aolp: mov bx,offset starta
mov al,i
xlat
mov ah,0
add cx,ax
and cx,0FFH
mov ah,0CH
mov bx,offset filla
mov al,i
xlat
mov bl,al
mov al,red ;填充为背景色
ailp: mov bh,b
int 10H
inc cx
dec bl
cmp bl,0
jnz ailp
inc dx
mov al,i
inc al
mov i,al
cmp al,cnta
jnz aolp
ret
draws endp
end
这个程序画出来五角星是这样的: