汇编程序--五环

 

DATA SEGMENT
X DW ?
Y DW ?   ;(X,Y用来存储0,25h)  
X1 DW 100      ;第100行
Y1 DW 50      ;第50列
R DW 25H
X4 DW ?   ;(X4,Y4)在子程序Dian中用来保存传递数据(DX,CX)
Y4 DW ?
N DB ?         ;存储像素值
D DW ?        ;存储误差更新
M DW ?
X2 DW ?
Y2 DW ?   ;(X2,Y2)在子程序Huayuan中用来保存传递数据(DX,CX)
x3 dw ?
y3 dw ?   ;(X3,Y3)用来存储传递(X1,Y1)
STRING1 DB 'If you want to quit please Press q$'
STRING2 DB 'press any key to show circles:$'
DATA ENDS
CODE  SEGMENT
ASSUME CS:CODE,DS:DATA
;------------------------------------------------------------
MAIN PROC FAR    
START: MOV AX,DATA
  MOV DS,AX
  CALL Clear  ;清屏子程序
  CALL Set_mode ;显示方式
  LEA DX,STRING1
  MOV AH,09H
  INT 21H
  MOV DX,0200H  ;在下一行显示STRING2
  CALL Set_cursor
  LEA DX,STRING2
  MOV AH,9H
  INT 21H
  MOV AH,1
  INT 21H
  CMP AL,'q'
  JZ EXIT
  CALL Circle
EXIT:
  MOV AH,4CH
  INT 21H
MAIN ENDP
;--------------------------------------------
Clear PROC NEAR
  MOV AX,0600H
  MOV BH,8  ;字符显示绿色
  MOV CX,0
  MOV DX,184fH ;184F正好全屏清屏
  INT 10H
  RET
Clear ENDP
;------------------------------------------
Set_mode PROC  ;320*200,256色图形(VGA)
  MOV AH,0
  MOV AL,13H
  INT 10H
  RET
Set_mode ENDP
;-----------------------------------------------
Set_cursor PROC  ;置光标,BH页号,DH/HL=行/列
  MOV AH,2  ;DH/DL在前面指定
  MOV BH,0
  INT 10H
  RET
Set_cursor ENDP
;--------------------------------------------
Set_color PROC  ;写像素,AL颜色值,BH页号,
  MOV AH,0CH  ;DX/CX像素行/列
  MOV AL,N
  MOV BH,0
  INT 10H
  RET            
Set_color ENDP
;---------------------------------------------  
Circle PROC  
  MOV SI,X1  ;保存(X1,Y1)后面会用到
  MOV X3,SI
  MOV SI,Y1
  MOV Y3,SI  
Yuan1:    ;Yuan1的圆心坐标(x1,y1)
   MOV N,9H
   MOV X,0
   MOV Y,25H
   CALL Pan_direction
Yuan2: MOV N,7H
   MOV X,0
   MOV Y,25H
   MOV BX,Y
   ADD Y1,BX
   ADD Y1,BX
   SHR BX,1
   ADD Y1,BX  ;Yuan2的圆心坐标(X1,Y1+2.5R)
   CALL Pan_direction
Yuan3: MOV N,29H
   MOV X,0
   MOV Y,25H
   MOV BX,Y
   MOV SI,Y3
   MOV Y1,SI
   ADD Y1,BX
   ADD Y1,BX
   ADD Y1,BX
   ADD Y1,BX
   ADD Y1,BX  ;Yuan3的圆心坐标(X1,Y1+5R)
   CALL Pan_direction
  
Yuan4: MOV N,6H
   MOV X,0
   MOV Y,25H
   MOV SI,X3
   MOV X1,SI
   MOV SI,Y3
   MOV Y1,SI
   MOV BX,Y
   ADD X1,BX
   ADD Y1,BX
   SHR BX,1
   SHR BX,1
   ADD Y1,BX  ;Yuan4的圆心坐标(X1+R,Y1+1.25R)
   CALL Pan_direction
  
Yuan5: MOV N,30H
   MOV X,0
   MOV Y,25H
   MOV SI,Y3
   MOV Y1,SI
   MOV BX,Y
   ADD Y1,BX
   ADD Y1,BX
   ADD Y1,BX
   SHR BX,1
   ADD Y1,BX
   SHR BX,1
   ADD Y1,BX  ;Yuan5的圆心坐标(X1+R,Y1+3.75R)
   CALL Pan_direction
  
   RET
Circle endp
;---------------------------------------
Pan_direction proc near
                              
MOV SI,1
SUB SI,R  
MOV D,SI     ;D存储修正值
PAN3:
MOV SI,X
MOV DI,Y
ADD SI,X1
ADD DI,Y1
MOV DX,SI
MOV CX,DI
MOV SI,X
MOV DI,Y
CMP SI,DI  ;当X增大到Y时跳出
JG PAN
CALL Huayuan
CMP D,0   ;若D>=0,则修正D=D+2(X-Y)+5
JGE PAN1
MOV SI,2  ;若D<0,则修正D=D+2X+3
MOV AX,SI
IMUL X
ADD D,AX
ADD D,3
PAN2:
INC X

JMP PAN3
PAN1:
MOV SI,2
MOV AX,X
SUB AX,Y
IMUL SI
ADD D,AX
ADD D,5
DEC Y

JMP PAN2
PAN:RET
Pan_direction endp
;-----------------------------------------------
Huayuan PROC
  MOV X2,DX
    MOV Y2,CX
  call dian   ;画第一点  (x,y)

  MOV X2,DX
  MOV Y2,CX
  SUB DX,X1
  SUB CX,Y1
  ADD CX,X1
  ADD DX,Y1
  XCHG DX,CX
  CALL Dian ;画第二点(Y,X)
  
  MOV DX,X4
  MOV CX,Y4
  SUB DX,X1
  MOV AX,X1
  SUB AX,DX
  MOV DX,AX
  CALL Dian ;画第三点(y,-x)
  
  MOV DX,X4
  MOV CX,Y4
  SUB CX,Y1
  MOV AX,Y1
  SUB AX,CX
  MOV CX,AX
  CALL Dian ;画第四点(-y,-x)
  
  MOV DX,X4
  MOV CX,Y4
  MOV AX,X1
  SUB AX,DX
  ADD AX,X1
  MOV DX,AX
  CALL Dian ;画第五点(-Y,X)
  
  MOV DX,X2
  MOV CX,Y2
  SUB DX,X1
  MOV AX,X1
  SUB AX,DX
  MOV DX,AX
  CALL Dian ;画第六点(X,-Y)
  
  MOV DX,X4
  MOV CX,Y4
  SUB CX,Y1
  MOV AX,Y1
  SUB AX,CX
  MOV CX,AX
  CALL Dian ;画第七点(-X,-Y)
  
  MOV DX,X4
  MOV CX,Y4
  MOV AX,X1
  SUB AX,DX
  ADD AX,X1
  MOV DX,AX
  CALL Dian ;画第八点(-X,Y)
  CALL Delay
    RET
Huayuan ENDP
;----------------------------------------------
Dian PROC
  CALL Set_color ;画点,CX,DX的加减是为加深线条
  MOV X4,DX
  MOV Y4,CX
  INC CX
  CALL Set_color
  SUB CX,2
  CALL Set_color
  INC DX
  CALL Set_color
  INC CX
  CALL Set_color
  INC CX
  CALL Set_color
  MOV DX,X4
  MOV CX,Y4
  RET
Dian ENDP
;---------------------------------------
Delay PROC  ;画一个圆的延时程序
  PUSH CX
  PUSH DX
  MOV DX,1000
DE1:MOV CX,5000
DE2:LOOP DE2
  DEC DX
  JNZ DE1
  POP DX
  POP CX
  RET
Delay ENDP
;----------------------------------------
CODE ENDS
END MAIN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值