Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- includelib libcmt.lib
- includelib libvcruntime.lib
- includelib libucrt.lib
- includelib legacy_stdio_definitions.lib
- extern printf_s: proc, scanf_s: proc
- .data
- promptMessage byte "1. Find area of a triangle", 13, 10,
- "2. Find surface area of a sphere", 13, 13, 10,
- "Please select your choice(1 or 2) : ", 0
- trianglePromptMessage byte " ", 13, 10, "Enter three sides of a triangle [in cm]: ", 0
- spherePromptMessage byte " ", 13, 10, "Enter the sphere radius [in cm]: ", 0
- triangleInputFormatString byte "%lf%lf%lf", 0
- sphereInputFormatString byte "%lf", 0
- choiceInputFormatString byte "%d", 0
- triangleOutputString byte "Triangle area = %0.2f square cm.", 13, 10, 0
- sphereOutputString byte "Surface area = %0.2f square cm.", 13, 10, 0
- choiceErrorString byte "Error: Wrong menu choice!", 13, 10, 0
- triangleErrorString byte "Error: Invalid value for triangle side!", 13, 10, 0
- radiusErrorString byte "Error: Invalid radius value!", 13, 10, 0
- sidesErrorString byte "Error: The three sides do not form a triangle!", 13, 10, 0
- PI real8 3.14159
- ZERO real8 0.0
- TWO real8 2.0
- FOUR real8 4.0
- .data?
- choice dword ?
- side1 real8 ?
- side2 real8 ?
- side3 real8 ?
- radius real8 ?
- triangleArea real8 ?
- surfaceArea real8 ?
- .code
- main proc
- enter 32, 0
- lea rcx, promptMessage
- call printf_s
- lea rdx, choice
- lea rcx, choiceInputFormatString
- call scanf_s
- cmp choice, 1
- jb choiceErrorMessage
- cmp choice, 2
- ja choiceErrorMessage
- cmp choice, 2
- je sphereSurfaceArea
- triangle:
- lea rcx, trianglePromptMessage
- call printf_s
- lea r9, side3
- lea r8, side2
- lea rdx, side1
- lea rcx, triangleInputFormatString
- call scanf_s
- movq xmm0, side3
- comisd xmm0, ZERO
- jbe triangleErrorMessage
- movq xmm0, side2
- comisd xmm0, ZERO
- jbe triangleErrorMessage
- movq xmm0, side1
- comisd xmm0, ZERO
- jbe triangleErrorMessage
- movsd xmm0, side1
- addsd xmm0, side2
- comisd xmm0, side3
- jbe sidesErrorMessage
- movsd xmm0, side1
- addsd xmm0, side3
- comisd xmm0, side2
- jbe sidesErrorMessage
- movsd xmm0, side2
- addsd xmm0, side3
- comisd xmm0, side1
- jbe sidesErrorMessage
- mov r8, side3
- mov rdx, side2
- mov rcx, side1
- call getTriangleArea
- movsd triangleArea, xmm0
- mov rdx, triangleArea
- lea rcx, triangleOutputString
- call printf_s
- jmp endProgram
- sphereSurfaceArea:
- lea rcx, spherePromptMessage
- call printf_s
- lea rdx, radius
- lea rcx, sphereInputFormatString
- call scanf_s
- movsd xmm0, radius
- comisd xmm0, ZERO
- jbe SphereErrorMessage
- movsd xmm0, radius
- call getSphereSurfaceArea
- movsd surfaceArea, xmm0
- movsd xmm1, surfaceArea
- lea rcx, sphereOutputString
- call printf_s
- jmp endProgram
- choiceErrorMessage:
- lea rcx, choiceErrorString
- call printf_s
- jmp endProgram
- triangleErrorMessage:
- lea rcx, triangleErrorString
- call printf_s
- jmp endProgram
- sidesErrorMessage:
- lea rcx, sidesErrorString
- call printf_s
- SphereErrorMessage:
- lea rcx, radiusErrorString
- call printf_s
- jmp endProgram
- endProgram:
- leave
- xor rax, rax
- ret
- main endp
- getTriangleArea proc
- push rbp
- mov rbp, rsp
- sub rsp, 24 ; Make a space for 3 local variables
- movsd real8 ptr [rbp - 8], xmm0 ; localvar1 <---- side1
- movsd real8 ptr [rbp - 16], xmm1 ; localvar2 <---- side2
- movsd real8 ptr [rbp - 24], xmm2 ; localvar3 <---- side3
- addsd xmm0, xmm1
- addsd xmm0, xmm2
- divsd xmm0, TWO ; xmm0 <---- S = (s1 + s2 +s3) / 2.0
- movsd xmm1, xmm0 ; xmm1 <---- S
- subsd xmm1, real8 ptr [rbp - 8] ; xmm1 <---- (S - side1)
- movsd xmm2, xmm0 ; xmm2 <---- S
- subsd xmm2, real8 ptr [rbp - 16] ; xmm2 <---- (S - side2)
- movsd xmm3, xmm0 ; xmm3 <---- S
- subsd xmm3, real8 ptr [rbp - 24] ; xmm3 <---- (S - side3)
- mulsd xmm0, xmm1 ; xmm0 <---- res = S * (S - side1)
- mulsd xmm0, xmm2 ; xmm0 <---- res * (S - side2)
- mulsd xmm0, xmm3 ; xmm0 <---- res * (S - side3)
- sqrtsd xmm0, xmm0 ; xmm0 <---- sqrt(xmm0)
- mov rsp, rbp
- pop rbp
- ret
- getTriangleArea endp
- getSphereSurfaceArea proc
- mulsd xmm0, xmm0 ; xmm0 <---- radius * radius
- mulsd xmm0, PI ; xmm0 <---- PI * radius * radius
- mulsd xmm0, FOUR ; xmm0 <---- 4.0 * PI * radius * radius
- ret
- getSphereSurfaceArea endp
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement