;Programa de Identificacao de Triangulos

;Sera triangulo se: a + b > c (sendo c o lado maior)

;Equilatero -> A = B = C

;Retangulo  -> C^2 = A^2 + B^2

;Agudo      -> C^2 < A^2 + B^2

;Obtuso     -> C^2 > A^2 + B^2

;Isoceles   -> A = B <-> B = C

;Qualquer   -> A <> B <-> B <> C



Pilha Segment para Stack 'Stack'

      Db 512 Dup(0)

Pilha Ends



Dados Segment para Public 'Data'

      MsgNumero   Db 'Digite o Valor do Lado :$'

      MsgRetangul Db 'Triangulo Retangulo e $'

      MsgAgudo    Db 'Triangulo Agudo e $'

      MsgObtuso   Db 'Triangulo Obtuso e $'

      MsgEquilate Db 'Equilatero $'

      MsgIsoceles Db 'Isoceles $'

      MsgQualquer Db 'Qualquer $'

      A2B2        Dw 0

      A2          Dw 0

      B2          Dw 0

      C2          Dw 0

Dados Ends

Programa Segment para Public 'Code'

      Assume Cs:Programa,Ds:Dados,Es:Dados

      Org    100h

      Inicio Proc Far

         Push Ds

         Xor Ax,Ax

         Push Ax

         Mov Ax,Dados

         Mov Ds,Ax

         Mov Es,Ax

;Inicia a Leitura dos Lados dos Triangulos

         Mov Dx,OffSet MsgNumero

         Call Mostra

         Call LerInt

         Mov Cx,Ax

         Call PulaLinha

         Mov Dx,OffSet MsgNumero

         Call Mostra

         Call LerInt

         Mov Bx,Ax

         Call PulaLinha

         Mov Dx,OffSet MsgNumero

         Call Mostra

         Call LerInt

         Call PulaLinha



;Inicia a Classificacao

   Comp1:Cmp Ax,Bx

         Jbe Comp2

         XChg Ax,Bx



   Comp2:Cmp Bx,Cx

         Jbe FazC2

         XChg Bx,Cx

         Jmp Comp1



   FazC2:Push Ax

         Mov Ax,Cx

         IMul Cx

         Mov C2,Ax



         Mov Ax,Bx

         Imul Bx

         Mov A2B2,Ax

         Pop Ax

         Push Ax

         Imul Ax

         Add A2B2,Ax

         Mov Ax,C2

         Cmp Ax,A2B2

         Jb  Agudo

         Ja  Obtuso



    Retangulo: Mov Dx,OffSet MsgRetangul

         Call Mostra

         Jmp Continua



    Agudo: Mov Dx,OffSet MsgAgudo

         Call Mostra

         Jmp Continua



    Obtuso: Mov Dx,OffSet MsgObtuso

         Call Mostra

         Jmp Continua



    Continua: Pop Ax

         Cmp Ax,Cx

         Je Equilatero

         Cmp Ax,Bx

         Je Isoceles

         Cmp Bx,Cx

         Je Isoceles



    Qualquer:  Mov Dx,OffSet MsgQualquer

         Call Mostra

         Jmp Termina



    Equilatero: Mov Dx,OffSet MsgEquilate

         Call Mostra

         Jmp Termina



    Isoceles:  Mov Dx,OffSet MsgIsoceles

         Call Mostra

         Jmp Termina

    

    Termina: Ret

    Inicio Endp

    Extrn Mostra:Near

    Extrn LerInt:Near

    Extrn PulaLinha:Near

Programa Ends

End Inicio

