使用8087协处理器计算8086/8088中给定角度的正切

Calculating tangent of a provided angle in 8086/8088 using 8087 coprocessor

我有一个项目要完成,该项目是使用 8087 协处理器编写一个基于 8086/8087 的程序来求角度的正切。 角度应以度为单位并打印 tan(angle)

的输出

到目前为止我所做的是:

.model small
.stack 100h

.data

angle   dd      0.0
TanX    dd      0.0

.code
mov ax,@data
mov ds,ax


    fld     long[angle]            ; st(0) = angle
    fsincos                         ; st(0) = cos(angle);  st(1) = sin(angle)
    fdivrp  st1, st0                ; st(0) = st(1) / st(0)   ( = sin/cos )
    fstp    long [TanX]             ; TanX = tan(angle)

end

我做错了什么吗?我怎样才能改进我写的东西?

;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Name: Mohammad Tayseer Mohammad Abu Mailiesh
; Date: April, 19th 2019
; Project: Tangent calculator
; Overview: Asm program that finds the tangent of a defined angle
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;



.model small
.stack 100h

.data

angle    dd      40.0 ;angle in degrees desired to be computed 
oneighty dd      180.0
var      dd      1.0 
tanx1    dd      0.0 
tanx     dd      0.0
angle1   dd      0.0


.code
main proc far
mov ax,@data
mov ds,ax

finit ;initialize FPU after checking for pending unmasked floating-point exceptions

;;;;;;;;;;;;;;;;;;;;finding and calculating where the angle lies and change it to an angle that lies inbetween 0 and 45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            mov ax, angle
            cmp ax, 90.0
        JA B2
            cmp ax, 45.0
        JB B1
            mov ax, 90.0
            SUB ax, angle
        Jmp B1

 B2:        cmp ax, 180.0
            JA B3
            mov ax, 180.0
            SUB ax, angle
        Jmp B1

 B3:        cmp ax, 270.0
            JA B4
            mov ax, angle
            SUB ax, 180.0
        Jmp B1

 B4:        mov ax, 360.0
            SUB ax, angle
        Jmp B1


 B1:    cmp ax, 45.0
        JB S1
        mov dx, ax
        mov ax, 90.0
        SUB ax, dx
        Jmp S1

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; changing angle from degrees to radian ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 S1:    mov angle1, ax
        fld oneighty 
        fld angle1
        fldpi
        fmul
        fdiv

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; computing tangent of the angle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        fld angle ;st(0) = angle
        fptan ;st(0) = cos(angle), st(1) = sin(angle)
        fwait
        fstp tanx ;tanx = tan(angle)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; if the value is in the other half of first box (from 45 to 90) then 1/tanx to get the right value ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        CMP dx, 45
        JB E1
        fild var
        fild tanx
        fdiv
        fwait
        fstp tanx1
        Jmp E2


 E1:    mov ah,4ch ;end the program
        int 21h

 E2:    mov ah,4ch ;end the program
        int 21h

main endp
end main

如果有人正在寻找,这是附加问题的完整解决方案。 谢谢大家!