In: Computer Science
Assembly using x86 irvine (masm)
Write a complete program that will input values for num1 ,num2, and num3 and display the
value of the expression ( (num1 ^ 3) * num2 + 5 * ( num2 ^ 2) ) / num3.
assume that the user enters only numbers that are greater than zero and the calculation never exceed 4 bytes size.
Sample run:
num1 = 1
num2 = 2
num3 = 3
((num1 ^ 3) * num2 + 5 * ( num2 ^ 2)) / num3 = 7 R 1
_DATA SEGMENT
COMM ?OptionsStorage@?1??local_stdio_printf_options@@9@9:QWORD ; `_local_stdio_printf_options'::`2'::_OptionsStorage
COMM ?OptionsStorage@?1??local_stdio_scanf_options@@9@9:QWORD ; `_local_stdio_scanf_options'::`2'::_OptionsStorage
_DATA ENDS
_DATA SEGMENT
$SG8912 DB '%d', 00H
ORG $+1
$SG8913 DB '%d', 00H
ORG $+1
$SG8914 DB '%d', 00H
ORG $+1
$SG8915 DB '%d', 00H
_DATA ENDS
_num$ = -16 ; size = 4
_num3$ = -12 ; size = 4
_num1$ = -8 ; size = 4
_num2$ = -4 ; size = 4
_main PROC
push ebp
mov ebp, esp
sub esp, 16 ; 00000010H
lea eax, DWORD PTR _num1$[ebp]
push eax
push OFFSET $SG8912
call _scanf
add esp, 8
lea ecx, DWORD PTR _num2$[ebp]
push ecx
push OFFSET $SG8913
call _scanf
add esp, 8
lea edx, DWORD PTR _num3$[ebp]
push edx
push OFFSET $SG8914
call _scanf
add esp, 8
mov eax, DWORD PTR _num1$[ebp]
xor eax, 3
imul eax, DWORD PTR _num2$[ebp]
mov ecx, DWORD PTR _num2$[ebp]
xor ecx, 2
imul edx, ecx, 5
add eax, edx
cdq
idiv DWORD PTR _num3$[ebp]
mov DWORD PTR _num$[ebp], eax
mov eax, DWORD PTR _num$[ebp]
push eax
push OFFSET $SG8915
call _printf
add esp, 8
mov eax, 1
mov esp, ebp
pop ebp
ret 0
_main ENDP
___local_stdio_printf_options PROC ; COMDAT
push ebp
mov ebp, esp
mov eax, OFFSET ?OptionsStorage@?1??local_stdio_printf_options@@9@9 ; `_local_stdio_printf_options'::`2'::_OptionsStorage
pop ebp
ret 0
___local_stdio_printf_options ENDP
___local_stdio_scanf_options PROC ; COMDAT
push ebp
mov ebp, esp
mov eax, OFFSET ?OptionsStorage@?1??local_stdio_scanf_options@@9@9 ; `_local_stdio_scanf_options'::`2'::_OptionsStorage
pop ebp
ret 0
___local_stdio_scanf_options ENDP
__Stream$ = 8 ; size = 4
__Format$ = 12 ; size = 4
__Locale$ = 16 ; size = 4
__ArgList$ = 20 ; size = 4
__vfprintf_l PROC ; COMDAT
push ebp
mov ebp, esp
mov eax, DWORD PTR __ArgList$[ebp]
push eax
mov ecx, DWORD PTR __Locale$[ebp]
push ecx
mov edx, DWORD PTR __Format$[ebp]
push edx
mov eax, DWORD PTR __Stream$[ebp]
push eax
call ___local_stdio_printf_options
mov ecx, DWORD PTR [eax+4]
push ecx
mov edx, DWORD PTR [eax]
push edx
call ___stdio_common_vfprintf
add esp, 24 ; 00000018H
pop ebp
ret 0
__vfprintf_l ENDP
__Result$ = -8 ; size = 4
__ArgList$ = -4 ; size = 4
__Format$ = 8 ; size = 4
_printf PROC ; COMDAT
push ebp
mov ebp, esp
sub esp, 8
lea eax, DWORD PTR __Format$[ebp+4]
mov DWORD PTR __ArgList$[ebp], eax
mov ecx, DWORD PTR __ArgList$[ebp]
push ecx
push 0
mov edx, DWORD PTR __Format$[ebp]
push edx
push 1
call ___acrt_iob_func
add esp, 4
push eax
call __vfprintf_l
add esp, 16 ; 00000010H
mov DWORD PTR __Result$[ebp], eax
mov DWORD PTR __ArgList$[ebp], 0
mov eax, DWORD PTR __Result$[ebp]
mov esp, ebp
pop ebp
ret 0
_printf ENDP
__Stream$ = 8 ; size = 4
__Format$ = 12 ; size = 4
__Locale$ = 16 ; size = 4
__ArgList$ = 20 ; size = 4
__vfscanf_l PROC ; COMDAT
push ebp
mov ebp, esp
mov eax, DWORD PTR __ArgList$[ebp]
push eax
mov ecx, DWORD PTR __Locale$[ebp]
push ecx
mov edx, DWORD PTR __Format$[ebp]
push edx
mov eax, DWORD PTR __Stream$[ebp]
push eax
call ___local_stdio_scanf_options
mov ecx, DWORD PTR [eax+4]
push ecx
mov edx, DWORD PTR [eax]
push edx
call ___stdio_common_vfscanf
add esp, 24 ; 00000018H
pop ebp
ret 0
__vfscanf_l ENDP
__Result$ = -8 ; size = 4
__ArgList$ = -4 ; size = 4
__Format$ = 8 ; size = 4
_scanf PROC ; COMDAT
push ebp
mov ebp, esp
sub esp, 8
lea eax, DWORD PTR __Format$[ebp+4]
mov DWORD PTR __ArgList$[ebp], eax
mov ecx, DWORD PTR __ArgList$[ebp]
push ecx
push 0
mov edx, DWORD PTR __Format$[ebp]
push edx
push 0
call ___acrt_iob_func
add esp, 4
push eax
call __vfscanf_l
add esp, 16 ; 00000010H
mov DWORD PTR __Result$[ebp], eax
mov DWORD PTR __ArgList$[ebp], 0
mov eax, DWORD PTR __Result$[ebp]
mov esp, ebp
pop ebp
ret 0
_scanf ENDP