输入圆的半径●●●●●●大于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
...全文
71 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,458

社区成员

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

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