.8087 PAGE 60,132 .MODEL SMALL ;program to calculate SIN, COS, TAN, and COT of a 30-degree angle .STACK 32 ;---------------------------- .DATA ORG 00H ANGLE DD 0.523598776 ;angle in radian for 30 degrees ORG 10H X DD 0 ORG 20H Y DD 0 ORG 30H R DD 0 ORG 40H SIN DD 0 ORG 50H COS DD 0 ORG 60H TAN DD 0 ORG 70H COT DD 0 ;---------------------------- .CODE START PROC FAR MOV AX,@DATA MOV DS,AX CALL CALC_X_Y CALL CALC_R CALL CALC_SIN CALL CALC_COS CALL CALC_TAN CALL CALC_COT MOV AH,4CH INT 21H START ENDP ;----------------------------- ;procedure to calculate X and Y given an angle CALC_X_Y PROC NEAR FINIT ;initialize 8087 FLD ANGLE ;load ANGLE onto stack FPTAN ;calculate X and Y FSTP X ;store X and POP FSTP Y ;store Y and POP RET CALC_X_Y ENDP ;--------------------------- ;procedure to calculate hypotenuse given X and Y CALC_R PROC NEAR FINIT ;initialize 8087 FLD X ;load X onto stack FMUL ST(0),ST(0) ;square X FLD Y ;load Y onto stack FMUL ST(0),ST(0) ;square Y FADD ST(0),ST(1) ;calculate X**2 + Y**2 FSQRT ;take square root FST R ;store R RET CALC_R ENDP ;------------------------------ ;procedure to calculate SIN, given R and X CALC_SIN PROC NEAR FINIT ;initialize 8087 FLD R ;load R onto stack FLD Y ;load Y onto stack FDIV ST(0),ST(1) ;SIN = Y/R FST SIN ;store SIN RET CALC_SIN ENDP ;------------------------------ ;procedure to calculate COS, given R and X CALC_COS PROC NEAR FINIT ;initialize 8087 FLD R ;load R onto stack FLD X ;load X onto stack FDIV ST(0),ST(1) ;COS = X/R FST COS ;store COS RET CALC_COS ENDP ;------------------------------ ;procedure to calculate TAN, given X and Y CALC_TAN PROC NEAR FINIT ;initialize 8087 FLD X ;load X onto stack FLD Y ;load Y onto stack FDIV ST(0),ST(1) ;TAN = Y/X FST TAN ;store TAN RET CALC_TAN ENDP ;------------------------------ ;procedure to calculate COT, given X and Y CALC_COT PROC NEAR FINIT ;initialize 8087 FLD Y ;load Y onto stack FLD X ;load X onto stack FDIV ST(0),ST(1) ;COT = X/Y FST COT ;store COT RET CALC_COT ENDP ;----------------------------- END START