输入圆的半径●●●●●●大于181开始画错!为什么?●●●●●●

x0s0z0 2009-07-20 11:39:40

DATA SEGMENT
produ1 dw 4 dup(0);存放半径平方
produ2 dw 4 dup(0);存放三角形水平边平方
produ3 dw 4 dup(0);存放三角形垂直边平方;第三次不必设置了,因它的值已在ax,dx中
r=181;输入圆的半径●●●●●●大于181开始画错!为什么?●●●●●●
x=300
y=240;圆心坐标
DATA ENDS

code SEGMENT
ASSUME cs:code,DS:DATA
start:

mov bx,505fh
mov ax,4f02h
int 10h ;显示模式

mov ax,data
mov ds,ax


mov si,0
mov cx,x-r;行
mov dx,y;竖●起点坐标
mov al,02
mov ah,0ch
int 10h
lop1:mov dx,y
inc cx
mov produ1+2 , cx
mov produ1+4 , dx
add si,1
mov ax,r;●计算三角形水平边平方
sub ax,si
mul ax
mov bx,ax
mov cx,dx;保存
mov ax,r;●计算半径r平方
mul ax

call shuangjian
call sqr
mov dx,produ1+4
sub dx,bp
mov cx,produ1+2
cmp dx,y-r
je exit1;用jb时dx从不小于y-r,故si不断增长使mov ax,r产生负数,显然开平方后的bp值是负值,这导致最后阶段产生星星,故改为je●
mov al,02
mov ah,0ch
int 10h

push cx
push dx
call delay2;●漫漫画给你看
pop dx
pop cx
jmp lop1
exit1:
;●●●●●本来此段只用来画左上角1/4周,怎会画出半圆?取此前名为“994有进步”比较发现,将开平方中的cl改为bp即会画出1/2圆!
;发现杂点与半径大小有关,r=180时画1/2周只有最后2点跑去当星星

mov ah,1
int 21h
mov ah,4ch
int 21h

delay2 proc
mov ah,01;设置时间计数器功能调用
mov cx,0;置时间计数器初值
mov dx,0
int 1ah
delay:mov ah,00;读时间计数器当前值
int 1ah
cmp dx,2h;●
jb delay
ret
delay2 endp

sqr proc
mov bp,0;●垂直边开平方
mov di,01
lop:sub bx,di
jb end0
inc bp
add di,02
jmp lop
end0:
ret
sqr endp

shuangjian proc
;●双字减法,入口参量:bx减数的低16位,cx减数的高16位,dx被减数高16位,ax被减数低16位
sub dx,cx;高位相减,且已知被减数>减数;a^2=r^2-b^2
cmp ax,bx
jg reduce;当ax大于bx才转
xchg ax,bx;有交换(右边的数大于ax)才须借1
sub ax,bx
sub dx,0001;借1
mov bx,9999;意为10000-1=9999
sub bx,ax
jmp ok
reduce:sub ax,bx
mov bx,ax
ok:add bx,1;结果在bx中
ret
shuangjian endp

code ends
end start
...全文
74 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧