我是汇编程序的新手,我正在寻找如何在我的代码中插入循环的简单解决方案。你们能给我一个提示或答案吗?我在谷歌上发现了一些文章,我无法理解它们因为我很愚蠢。我做了一个项目:水动画,http://kino-ap.eng.hokudai.ac.jp/all-LiF.gif http://thumbs.dreamstime.com/z/circular-splash-drop-water-blue-forming-circle-waves-liquid-surface-37560386.jpg
我想使用Circle,所以我找到了这段代码
nasm -O999 -o kolo.com -f bin kolo.asm
org 100h
mov ax, 13h
int 10h
mov ax, 0a000h
mov es, ax
mov cx, 360
finit
fldpi
fild word [sto80]
fdivp st1, st0 ; pi/180
fld1
fild word [r] ; r, 1, pi/180
fldz ; angle=0, r, 1, pi/180
mov al, 15
draw:
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
mov di, 100*320 + 160 ; middle of screen
fsin ; sin(angle), angle, r, 1, pi/180
fmul st2 ; sin(angle)*r, angle, r, 1, pi/180
fistp word [height] ; angle, r, 1, pi/180
fld st0 ; angle, angle, r, 1, pi/180
fmul st4 ; angle in radius
fcos ; cos(angle),angle, r, 1, pi/180
fmul st2 ; r*cos(angle), angle, r, 1, pi/180
fistp word [width] ; angle, r, 1, pi/180
add di, [width] ; add the horizontal length
mov dx, [height]
mov bx, dx
shl dx, 8
shl bx, 6
add dx, bx ; dx = height*320
sub di, dx ; We subtract the vertical distance
mov [es:di], al ; show pixel
fadd st0, st2 ; angle += 1
dec cx
jnz draw
finit
xor ah, ah
int 16h
mov ax, 3
int 10h
mov ax, 4c00h
int 21h
r dw 50
width dw 0
height dw 0
sto80 dw 180
现在我想添加一个将增加的圆圈。我需要添加一个循环来增加r(对于r = 0; r <300; r ++。在r == 300之后改变r = 0)并重绘它并可能隐藏最后一个圆形像素?
答案 0 :(得分:1)
你不应该让你的半径大于99,因为屏幕的尺寸是320x200,你是从屏幕的中心绘制的,没有检查DI寄存器中地址计算的结果。
要获得所需的循环,请进行以下更改:
org 100h
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
NextCircle: ; Add this
mov cx, 360
...
fadd st0, st2 ; angle += 1
dec cx
jnz draw
xor ah, ah ; Maybe add this (To wait between circles)
int 16h ; Maybe add this (To wait between circles)
inc word [r] ; Add this
cmp word [r], 100 ; Add this
jb NextCircle ; Add this
finit
xor ah, ah
int 16h
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
要隐藏上一个圆圈,您可以使用黑色(AL = 0)重绘它。