Advertisement
kerelius

Untitled

Oct 8th, 2019
2,244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. includelib libcmt.lib
  2. includelib libvcruntime.lib
  3. includelib libucrt.lib
  4. includelib legacy_stdio_definitions.lib  
  5.  
  6. extern printf_s: proc, scanf_s: proc
  7.  
  8. .data
  9.     promptMessage                byte       "1. Find area of a triangle", 13, 10,
  10.                                             "2. Find surface area of a sphere", 13, 13, 10,
  11.                                             "Please select your choice(1 or 2) : ", 0
  12.  
  13.     trianglePromptMessage        byte   " ", 13, 10, "Enter three sides of a triangle [in cm]: ", 0
  14.     spherePromptMessage          byte   " ", 13, 10, "Enter the sphere radius [in cm]: ", 0
  15.     triangleInputFormatString    byte   "%lf%lf%lf", 0
  16.     sphereInputFormatString      byte   "%lf", 0
  17.     choiceInputFormatString      byte   "%d", 0
  18.     triangleOutputString         byte   "Triangle area = %0.2f square cm.", 13, 10, 0
  19.     sphereOutputString           byte   "Surface area = %0.2f square cm.", 13, 10, 0
  20.     choiceErrorString            byte   "Error: Wrong menu choice!", 13, 10, 0
  21.     triangleErrorString          byte   "Error: Invalid value for triangle side!", 13, 10, 0
  22.     radiusErrorString            byte   "Error: Invalid radius value!", 13, 10, 0
  23.     sidesErrorString             byte   "Error: The three sides do not form a triangle!", 13, 10, 0
  24.     PI      real8   3.14159
  25.     ZERO    real8   0.0
  26.     TWO     real8   2.0
  27.     FOUR    real8   4.0
  28. .data?
  29.     choice  dword   ?
  30.     side1   real8   ?
  31.     side2   real8   ?
  32.     side3   real8   ?
  33.     radius  real8   ?
  34.     triangleArea    real8   ?
  35.     surfaceArea     real8   ?
  36.  
  37. .code
  38. main proc
  39.     enter   32, 0
  40.    
  41.     lea     rcx,    promptMessage
  42.     call    printf_s
  43.  
  44.     lea     rdx,    choice
  45.     lea     rcx,    choiceInputFormatString
  46.     call    scanf_s
  47.  
  48.     cmp     choice,     1
  49.     jb      choiceErrorMessage
  50.    
  51.     cmp     choice,     2
  52.     ja      choiceErrorMessage
  53.  
  54.     cmp     choice,     2
  55.     je      sphereSurfaceArea
  56.  
  57.     triangle:
  58.         lea     rcx,    trianglePromptMessage
  59.         call    printf_s
  60.  
  61.         lea     r9,     side3
  62.         lea     r8,     side2
  63.         lea     rdx,    side1
  64.         lea     rcx,    triangleInputFormatString
  65.         call    scanf_s
  66.  
  67.         movq    xmm0,   side3  
  68.         comisd  xmm0,   ZERO
  69.         jbe     triangleErrorMessage
  70.         movq    xmm0,   side2  
  71.         comisd  xmm0,   ZERO
  72.         jbe     triangleErrorMessage
  73.         movq    xmm0,   side1          
  74.         comisd  xmm0,   ZERO
  75.         jbe     triangleErrorMessage
  76.  
  77.         movsd   xmm0,   side1
  78.         addsd   xmm0,   side2
  79.         comisd  xmm0,   side3
  80.         jbe     sidesErrorMessage
  81.  
  82.         movsd   xmm0,   side1
  83.         addsd   xmm0,   side3
  84.         comisd  xmm0,   side2
  85.         jbe     sidesErrorMessage
  86.  
  87.         movsd   xmm0,   side2
  88.         addsd   xmm0,   side3
  89.         comisd  xmm0,   side1
  90.         jbe     sidesErrorMessage
  91.  
  92.         mov     r8,     side3
  93.         mov     rdx,    side2
  94.         mov     rcx,    side1
  95.         call    getTriangleArea
  96.  
  97.         movsd   triangleArea,   xmm0
  98.        
  99.         mov     rdx,    triangleArea
  100.         lea     rcx,    triangleOutputString
  101.         call    printf_s
  102.  
  103.         jmp     endProgram
  104.  
  105.     sphereSurfaceArea:
  106.         lea     rcx,    spherePromptMessage
  107.         call    printf_s       
  108.  
  109.         lea     rdx,    radius
  110.         lea     rcx,    sphereInputFormatString
  111.         call    scanf_s
  112.  
  113.         movsd   xmm0,   radius
  114.         comisd  xmm0,   ZERO
  115.         jbe     SphereErrorMessage
  116.        
  117.         movsd   xmm0,   radius
  118.         call    getSphereSurfaceArea
  119.  
  120.         movsd   surfaceArea,    xmm0
  121.  
  122.         movsd   xmm1,   surfaceArea
  123.         lea     rcx,    sphereOutputString
  124.         call    printf_s
  125.        
  126.         jmp     endProgram
  127.  
  128.     choiceErrorMessage:
  129.         lea     rcx,    choiceErrorString
  130.         call    printf_s
  131.         jmp     endProgram
  132.  
  133.     triangleErrorMessage:  
  134.         lea     rcx,    triangleErrorString
  135.         call    printf_s
  136.         jmp     endProgram
  137.  
  138.     sidesErrorMessage:
  139.         lea     rcx,    sidesErrorString
  140.         call    printf_s
  141.  
  142.     SphereErrorMessage:
  143.         lea     rcx,    radiusErrorString
  144.         call    printf_s
  145.         jmp     endProgram
  146.    
  147.     endProgram:
  148.  
  149.     leave
  150.     xor     rax,    rax
  151.     ret
  152.    
  153. main endp
  154.  
  155. getTriangleArea proc
  156.     push    rbp
  157.     mov     rbp,    rsp
  158.     sub     rsp,    24      ; Make a space for 3 local variables
  159.  
  160.     movsd   real8 ptr [rbp - 8],    xmm0    ;   localvar1 <---- side1
  161.     movsd   real8 ptr [rbp - 16],   xmm1    ;   localvar2 <---- side2
  162.     movsd   real8 ptr [rbp - 24],   xmm2    ;   localvar3 <---- side3
  163.  
  164.     addsd   xmm0,   xmm1
  165.     addsd   xmm0,   xmm2
  166.  
  167.     divsd   xmm0,   TWO     ; xmm0 <---- S = (s1 + s2 +s3) / 2.0
  168.  
  169.     movsd   xmm1,   xmm0    ; xmm1 <---- S
  170.     subsd   xmm1,   real8 ptr [rbp - 8]     ; xmm1 <---- (S - side1)   
  171.  
  172.     movsd   xmm2,   xmm0    ; xmm2 <---- S
  173.     subsd   xmm2,   real8 ptr [rbp - 16]        ; xmm2 <---- (S - side2)
  174.  
  175.     movsd   xmm3,   xmm0    ; xmm3 <---- S
  176.     subsd   xmm3,   real8 ptr [rbp - 24]        ; xmm3 <---- (S - side3)
  177.  
  178.     mulsd   xmm0,   xmm1    ; xmm0 <---- res = S * (S - side1)
  179.     mulsd   xmm0,   xmm2    ; xmm0 <---- res * (S - side2)
  180.     mulsd   xmm0,   xmm3    ; xmm0 <---- res * (S - side3)
  181.  
  182.     sqrtsd  xmm0,   xmm0    ; xmm0 <---- sqrt(xmm0)
  183.  
  184.     mov     rsp,    rbp
  185.     pop     rbp
  186.     ret
  187.  
  188. getTriangleArea endp
  189.  
  190. getSphereSurfaceArea    proc
  191.     mulsd   xmm0,   xmm0    ; xmm0 <---- radius * radius
  192.     mulsd   xmm0,   PI      ; xmm0 <---- PI * radius * radius  
  193.     mulsd   xmm0,   FOUR    ; xmm0 <---- 4.0 * PI * radius * radius
  194.     ret
  195. getSphereSurfaceArea    endp
  196. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement