【发布时间】:2014-09-08 17:50:47
【问题描述】:
我试着计算数学公式
x1 = (radius + (Math.Sin(st)) *4) * Math.Cos(angle * PI / 180);
y1 = (radius + (Math.Sin(st)) * 4) * Math.Sin(angle * PI / 180);
所以我做了这个程序,但是出了点问题。我只得到一个像素。
org 100h
mov ax, 13h ; AH=0 (Change video mode), AL=13h (Mode)
int 10h ; Video BIOS interrupt
mov ax, 0A000h ; The offset to video memory
mov es, ax ; We load it to ES through AX, becouse immediate operation is not allowed on ES
finit ;inicjalizacja koprocesora :D
call Circle
ret
putpixel:
push cx
push dx ; mul changes dx too
mov cx, 320
mul cx ; multiply Y (ax) by 320 (one row)
add ax, bx ; and add X (bx) (result= dx:ax)
mov di, ax
pop dx
mov [es:di], dl ; store color/pixel
pop cx
ret
Circle:
; x1 = (radius + (Math.Sin(st)) * l*4) * Math.Cos(angle * PI / 180);
; y1 = (radius + (Math.Sin(st)) * l * 4) * Math.Sin(angle * PI / 180);
;stos:st,angle,r,4,pi/180
mov cx,360 ;ilosc powtozren petli rysujacej
tutaj:
add dword[angle],1
fldpi ;wrzucamy PI na stos stos:PI
fild dword[stos180] ;wrzucamy 180 na stos stos: 180,PI
fdivp st1,st0 ;dzielimy 180/PI
fild dword[skok] ;stos:4,pi/180
fild dword[r] ;stos r,4,pi/180
fild dword[angle] ;kąt stos:angle,r,4,pi/180
; x1 = (radius + (Math.Sin(st)) * l*4) * Math.Cos(angle * PI / 180);
fldz ;st stos: st,angle,r,4,pi/180
fsin ;sin(st),angle,r,4,pi/180
fmul st2 ;sin(st)*r,angle,4,pi/180
fmul st2 ;sin(st)*r*4,angle,pi/180
fild dword[l] ;l,sin(st)*r*4,angle,pi/180
fmul st1 ;l*sin(st)*r*4,angle,pi/180
FSTP dword[x] ;angle,pi/180
fmul st1 ;angle*pi/180
fcos ;cos(angle*pi/180)
fld dword[x] ;x,cos(angle*pi/180)
fmul st1 ;x*cos(angle*pi/180)
fistp dword[xf] ; stos pusty
fldpi ;wrzucamy PI na stos stos:PI
fild dword[stos180] ;wrzucamy 180 na stos stos: 180,PI
fdivp st1,st0 ;dzielimy 180/PI
fld dword[skok] ;stos:4,pi/180
fild dword[r] ;stos r,4,pi/180
fild dword[angle] ;kąt stos:angle,r,4,pi/180
; y1 = (radius + (Math.Sin(st)) * l * 4) * Math.Sin(angle * PI / 180);
fldz ;st stos: st,angle,r,4,pi/180
fsin ;sin(st),angle,r,4,pi/180
fmul st2 ;sin(st)*r,angle,4,pi/180
fmul st2 ;sin(st)*r*4,angle,pi/180
FSTP dword[l] ;l,sin(st)*r*4,angle,pi/180
fmul st1 ;l*sin(st)*r*4,angle,pi/180
fistp dword[y] ;angle,pi/180
fmul st1 ;angle*pi/180
fcos ;cos(angle*pi/180)
fld dword[y] ;x,cos(angle*pi/180)
fmul st1 ;x*cos(angle*pi/180)
fistp dword[yf] ; stos pusty
mov ax,word[yf]
mov bx,word[xf]
mov dl,7
call putpixel
loop tutaj
ret
stos180 dd 180.0
angle dd 0.0
skok dd 1.0
xo dd 10.0
yo dd 10.0
l dd 1.0
r dd 10.0
x dd 0.0
y dd 0.0
xf dd 0.0
yf dd 0.0
也许有人知道我做错了什么?
【问题讨论】:
-
为什么要使用
fild来加载浮点值?如果你有一个浮点值,你应该使用fld。 -
我操*赌注我会再试一次