Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Новый проект fasm32 успешно создан
- ; Заполнен демо программой «Здравствуй, мир!»
- format PE console
- entry start
- include 'includes\win32ax.inc'
- ;include 'WIN32AX.INC'
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.data' data readable writeable
- a dd ?
- b dd ?
- c dd ?
- tmp4 dd 4
- tmp3 dd 3
- result dd ?
- buffer db 20 dup(?)
- lbuffer dd ?
- stdin dd ?
- stdout dd ?
- first db 10 dup(?)
- lfirst dd ?
- ;Начальные сообщения
- MsgA db ' A='
- lMsgA = $-MsgA
- MsgB db ' B='
- lMsgB = $-MsgB
- MsgC db ' C='
- lMsgC = $-MsgC
- MsgRes db ' Result='
- lMsgRes = $-MsgRes
- ;Ошибки
- MsgEr0 db ' OverFlow'
- lMsgEr0 = $-MsgEr0
- MsgEr1 db ' Incorrect input'
- lMsgEr1 = $-MsgEr1
- MsgEr2 db ' Input error'
- lMsgEr2 = $-MsgEr2
- MsgEr3 db ' Division by ZERO'
- lMsgEr3 = $-MsgEr3
- kodEr dd 0
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.code' code readable executable
- start:
- invoke GetStdHandle, STD_OUTPUT_HANDLE
- mov [stdout], eax
- invoke GetStdHandle, STD_INPUT_HANDLE
- mov [stdin], eax
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ;Вводим A
- invoke WriteConsole, [stdout], MsgA, lMsgA, NULL, NULL
- stdcall readInt,a,kodEr
- cmp dword[kodEr],0
- jne vErr1
- ;Вводим B
- invoke WriteConsole, [stdout], MsgB, lMsgB, NULL, NULL
- stdcall readInt,b,kodEr
- cmp dword[kodEr],0
- jne vErr1
- ;Вводим C
- invoke WriteConsole, [stdout], MsgC, lMsgC, NULL, NULL
- stdcall readInt,c,kodEr
- cmp dword[kodEr],0
- jne vErr1
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ;(a+b/4-1)/(c/3-a*b)
- ;cinvoke printf,"%d",[a]
- ;cinvoke printf,"%d",[b]
- ;cinvoke printf,"%d",[c]
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- mov eax, [c]
- cdq
- idiv [tmp3]; c/3 - eax
- mov ecx, eax; c/3 - ecx
- mov eax, [a]
- imul [b]; a*b - eax:edx
- jo vErr0 ;переполнение
- mov ebx, eax ; a*b - ebx
- sub ecx,ebx; c/3 - a*b - ecx
- cmp ecx,0
- je vErr3
- mov eax, [b]
- cdq
- idiv [tmp4]; b/4 - eax
- add eax,[a]; a+b/4 - eax
- sub eax, 1; a+b/4-1 - eax
- cdq
- idiv ecx
- mov [result], eax
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- invoke WriteConsole,[stdout],MsgRes,lMsgRes,NULL,NULL
- stdcall WriteInt,[result]
- jmp exit
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- vErr0:
- invoke WriteConsole,[stdout],MsgEr0,lMsgEr0,NULL,NULL ;overflow
- jmp exit
- ;vErr1:
- ;cmp dword[kodEr],1
- ;jne vErr2
- ;invoke WriteConsole,[stdout],MsgEr1,lMsgEr1,NULL,NULL ;incorrect input
- ;jmp exit
- vErr1:
- invoke WriteConsole,[stdout],MsgEr2,lMsgEr2,NULL,NULL ;input error
- jmp exit
- vErr3:
- invoke WriteConsole,[stdout],MsgEr3,lMsgEr3,NULL,NULL ; division by zero
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- exit:
- cinvoke getchar
- cinvoke getchar
- invoke ExitProcess, 0
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- proc WriteInt number
- push eax
- push edx
- push esi
- push ecx
- push ebx
- push ebp
- mov eax,[number]
- mov esi,buffer
- mov ebp,10
- xor ecx,ecx
- xor ebx,ebx
- cmp eax,0
- jge m1
- mov byte[esi],'-'
- inc esi
- inc ebx
- neg eax
- m1:
- cdq
- idiv ebp
- push edx
- inc ecx
- cmp eax,0
- jne m1
- add ebx,ecx
- m2: pop edx
- add dl,'0'
- mov [esi],dl
- inc esi
- loop m2
- invoke WriteConsole,[stdout],buffer,ebx,NULL,NULL
- pop ebp
- pop ebx
- pop ecx
- pop esi
- pop edx
- pop eax
- ret
- endp
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- proc readInt numbers,ErrorIn
- pusha
- invoke ReadConsole,[stdin],buffer,12,lbuffer,NULL
- mov ecx,[lbuffer]
- sub ecx,2
- mov esi,buffer
- cmp byte[esi],'-'
- jne m3
- inc esi
- dec ecx
- m3:
- xor eax,eax
- mov edi,10
- xor ebx,ebx
- m4:
- mov bl,byte[esi]
- sub bl,'0'
- cmp bl,0
- jl er1
- cmp bl,9
- jg er1
- imul edi
- jo er2
- add eax,ebx
- jo er2
- jc er2
- inc esi
- loop m4
- cmp byte[buffer],'-'
- jne m5
- neg eax
- m5:
- mov edx,[numbers]
- mov [edx],eax
- mov edx,[ErrorIn]
- mov dword[edx],0
- jmp m6
- er1:
- mov edx,[ErrorIn]
- mov dword[edx],1
- jmp m6
- er2:
- mov edx,[ErrorIn]
- mov dword[edx],2
- m6:
- popa
- ret
- endp
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.idata' import data readable writeable
- library kernel32,'KERNEL32.DLL',\
- msvcrt,'msvcrt.dll'
- import kernel32,\
- GetStdHandle, 'GetStdHandle',\
- WriteConsole, 'WriteConsoleA',\
- ReadConsole, 'ReadConsoleA',\
- ExitProcess, 'ExitProcess'
- import msvcrt,printf,'printf',\
- scanf,'scanf',\
- getchar,'getchar'
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement