Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Новый проект fasm32 успешно создан
- ; Заполнен демо программой «Здравствуй, мир!»
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- format PE console
- entry start
- include 'includes\win32ax.inc'
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.data' data readable writeable
- a dd ?
- c dd ?
- b dd ?
- z dd ?
- Buffer db 12 dup(?)
- lBuffer = $ - Buffer
- CntCharRead dd ?
- answer dd ?
- stdin dd ?
- stdout dd ?
- first db 5 dup(?)
- lfirst dd ?
- MsgA db 'a = '
- lMsgA = $-MsgA
- Msgb db 'b = '
- lMsgb = $-Msgb
- MsgZ db 'Z = '
- lMsgZ = $-MsgZ
- MsgErr db 'Input error'
- LMsgErr = $- MsgErr
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.code' code readable executable
- start:
- invoke GetStdHandle,STD_OUTPUT_HANDLE
- mov [stdout],eax
- invoke GetStdHandle,STD_INPUT_HANDLE
- mov [stdin],eax
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ;Ввод данных
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- invoke WriteConsole,[stdout], MsgA, lMsgA, NULL, NULL
- stdcall readInt, a , answer
- cmp dword[answer], 0
- jne Err1
- invoke WriteConsole,[stdout], Msgb, lMsgb, NULL, NULL
- stdcall readInt, b , answer
- cmp dword[answer], 0
- jne Err1
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ;Проверяем второе условие на равенство
- mov eax,[a] ;Тут будет жить a - eax
- mov ebx,[b] ;Тут будет жить b - ebx
- cmp eax,ebx
- je Ravno ;если равны
- jg Bolzhe ;если больше
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ; a < b ===> (a*a-b)/b
- mov esi,eax ; esi = a
- imul esi ;a*a
- sub eax,ebx ;(a*a-b)
- mov ebx,[b]
- cdq
- idiv ebx
- jmp Konec
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ; a = b ===> -5
- Ravno:
- mov eax,-5
- jmp Konec
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ; a > b ===> b/a +5
- Bolzhe:
- mov eax,[b]
- ;cinvoke printf,"%d ",eax
- cdq
- idiv [a]
- ;cinvoke printf,"%d ",eax
- add eax,5
- ;cinvoke printf,"%d ",eax
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Konec: mov [z],eax
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- invoke WriteConsole,[stdout], MsgZ, lMsgZ, NULL, NULL
- stdcall writeInt, [z]
- jmp exit
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Err1:
- invoke WriteConsole,[stdout],MsgErr,LMsgErr, NULL, NULL
- exit:
- invoke ReadConsole,[stdin],first,1,lfirst,NULL
- invoke ExitProcess,0
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- proc writeInt number
- push eax
- push edx
- push ecx
- push esi
- push ebx
- push ebp
- mov eax, [number]
- mov esi, Buffer
- xor ecx,ecx
- xor ebp,ebp
- ;обработка знака
- cmp eax, 0
- jge m1
- mov byte[esi],'-'
- inc esi
- inc ebp
- neg eax
- ;получение цифр числа
- m1:
- mov ebx, 10
- ldiv: cdq
- idiv ebx
- push edx
- inc ecx
- cmp eax, 0
- jne ldiv
- add ebp,ecx ; длина строки для вывод
- ; извлечение цифр из стека и преобразование в символы
- l1: pop edx
- add dl, '0'
- mov [esi], dl
- inc esi
- loop l1
- invoke WriteConsole,[stdout],Buffer,ebp,NULL,NULL
- pop ebp
- pop ebx
- pop esi
- pop ecx
- pop edx
- pop eax
- ret
- endp
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- proc readInt number, errorIn ; errorIn =0 OK errorIn = 1 bukva errorIn = 2 over
- pusha
- invoke ReadConsole,[stdin],Buffer,lBuffer,CntCharRead,NULL ; чтение строки
- mov ecx, [CntCharRead]
- sub ecx, 2
- xor eax,eax
- xor esi, esi
- xor ebx, ebx
- mov edi, 10
- ; анализ знака
- cmp byte [Buffer],'-'
- jne m2
- dec ecx
- inc esi
- m2: ; выбираем сивол и преобразуем в цифру
- mov bl, [Buffer + esi]
- sub bl, '0'
- cmp bl, 0
- jl er1
- cmp bl, 9
- jg er1
- ; схема горнера
- imul edi
- jo er2
- add eax, ebx
- jc er2
- inc esi
- loop m2
- ; анализ знака
- cmp byte [Buffer],'-'
- jne m3
- neg eax
- m3: mov edx,[number] ; засение результатов в параметры
- mov [edx], eax
- mov edx, [errorIn]
- mov dword[edx], 0
- jmp m4
- er1: mov edx, [errorIn]
- mov dword[edx], 1
- jmp m4
- er2: mov edx, [errorIn]
- mov dword[edx], 2
- m4: popa
- ret
- endp
- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- section '.idata' import data readable writeable
- library kernel32,'kernel32.dll', msvcrt, 'msvcrt.dll'
- import kernel32,ExitProcess , 'ExitProcess' ,\
- GetStdHandle,'GetStdHandle',\
- WriteConsole,'WriteConsoleA',\
- ReadConsole,'ReadConsoleA',\
- GetProcessHeap, 'GetProcessHeap',\
- HeapCreate , 'HeapCreate' ,\
- HeapDestroy , 'HeapDestroy' ,\
- HeapAlloc , 'HeapAlloc' ,\
- HeapFree , 'HeapFree'
- import msvcrt, printf,'printf',scanf, 'scanf' ,getchar,'getchar'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement