Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- .MODEL flat, STDCALL
- WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
- ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
- GetStdHandle PROTO :DWORD
- ExitProcess PROTO :DWORD
- wsprintfA PROTO C :VARARG
- lstrlenA PROTO :DWORD
- .data
- dest BYTE 10 dup(0)
- dest2 BYTE 10 dup(0)
- hout DWORD 0
- zach1 BYTE "Wprowadz liczbe: "
- za DWORD 0
- zach2 BYTE "Wprowadz liczbe: "
- zb DWORD 0
- zach3 BYTE "Wprowadz liczbe: "
- zc DWORD 0
- zach4 BYTE "Wprowadz liczbe: "
- zd DWORD 0
- zacha BYTE "Wprowadz a: "
- zaa DB 1
- zachb BYTE "Wprowadz b: "
- zbb DB 1
- zachc BYTE "Wprowadz c: "
- zcc DB 1
- zachd BYTE "Wprowadz d: "
- zdd DB 1
- rout dd 0
- hin DWORD 0
- solutionText BYTE "Wynik obliczen dla funkcji y = a/(b+c)*d to: %i" , 0
- solutionBuffer BYTE 255 dup(0)
- solutionText2 BYTE "Wynik obliczen dla funkcji y = a AND (b OR c) XOR d to: %i" , 0
- solutionBuffer2 BYTE 255 dup(0)
- rinp DD 0 ;faktyczna liczba wprowadzonych znaków
- bufor DB 128 dup(?)
- rbuf DD 128
- buforBin BYTE 8 DUP(0),0
- .code
- main proc
- ;pobranie uchwytów do okna
- push -10
- call GetStdHandle
- mov hin, eax
- push -11
- call GetStdHandle
- mov hout, eax
- ;koniec pobierania uchwytów
- ;wyswietlanie zachety
- push 0
- push offset rout
- push 17
- push offset zach1
- push hout
- call WriteConsoleA
- ;czytanie a
- push 0
- push offset rout
- push 5
- push offset za
- push hin
- call ReadConsoleA
- mov EDX, OFFSET za
- add EDX, rout
- mov [EDX-2],BYTE PTR 0
- push OFFSET za ;adres poczatku ciagu znakow przekazywany na stos
- call atoi ;wywolanie procedury atoi
- mov za, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej za
- ;zacheta b
- push 0
- push offset rout
- push 17
- push offset zach2
- push hout
- call WriteConsoleA
- ;czytanie b
- push 0
- push offset rout
- push 5
- push offset zb
- push hin
- call ReadConsoleA
- mov EDX, OFFSET zb
- add EDX, rout
- mov [EDX-2],BYTE PTR 0
- push offset zb ;adres poczatku ciagu znakow przekazywany na stos
- call atoi ;wywolanie procedury atoi
- mov zb, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zb
- ;zacheta c
- push 0
- push offset rout
- push 17
- push offset zach3
- push hout
- call WriteConsoleA
- ;czytanie c
- push 0
- push offset rout
- push 5
- push offset zc
- push hin
- call ReadConsoleA
- mov EDX, OFFSET zc
- add EDX, rout
- mov [EDX-2],BYTE PTR 0
- push offset zc ;adres poczatku ciagu znakow przekazywany na stos
- call atoi ;wywolanie procedury atoi
- mov zc, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zc
- ;zacheta d
- push 0
- push offset rout
- push 17
- push offset zach4
- push hout
- call WriteConsoleA
- ;czytanie d
- push 0
- push offset rout
- push 5
- push offset zd
- push hin
- call ReadConsoleA
- mov EDX, OFFSET zd
- add EDX, rout
- mov [EDX-2],BYTE PTR 0
- push offset zd ;adres poczatku ciagu znakow przekazywany na stos
- call atoi ;wywolanie procedury atoi
- mov zd, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zd
- ; a/(b+c)*d
- mov EDX, 0
- mov ECX, zd
- mov EAX, zb
- mov EBX, zc
- add EAX, EBX
- mul ECX
- mov ECX, EAX
- mov ECX, za
- div ECX
- mov EAX, EDX
- push EAX
- push OFFSET solutionText
- push OFFSET solutionBuffer
- call wsprintfA
- add ESP, 12
- mov rinp, EAX
- ;wypisanie wyniku
- push 0
- push offset rout
- push rinp
- push offset solutionBuffer
- push hout
- call WriteConsoleA
- ;zacheta aa
- push 0
- push offset rout
- push 12
- push offset zacha
- push hout
- call WriteConsoleA
- ;czytanie aa
- push 0
- push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
- push rbuf ; rozmiar bufora
- push OFFSET bufor ;wskażnik na bufor
- push hin
- call ReadConsoleA
- lea EBX,bufor
- mov EDI,rinp
- mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
- ;--- przekształcenie A
- push OFFSET bufor
- call ScanBin
- mov zaa, AL
- ;zacheta bb
- push 0
- push offset rout
- push 12
- push offset zachb
- push hout
- call WriteConsoleA
- ;czytanie bb
- push 0
- push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
- push rbuf ; rozmiar bufora
- push OFFSET bufor ;wskażnik na bufor
- push hin
- call ReadConsoleA
- lea EBX,bufor
- mov EDI,rinp
- mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
- ;--- przekształcenie B
- push OFFSET bufor
- call ScanBin
- mov zbb, AL
- ;zacheta cc
- push 0
- push offset rout
- push 12
- push offset zachc
- push hout
- call WriteConsoleA
- ;czytanie cc
- push 0
- push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
- push rbuf ; rozmiar bufora
- push OFFSET bufor ;wskażnik na bufor
- push hin
- call ReadConsoleA
- lea EBX,bufor
- mov EDI,rinp
- mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
- ;--- przekształcenie C
- push OFFSET bufor
- call ScanBin
- mov zcc, AL
- ;zacheta dd
- push 0
- push offset rout
- push 12
- push offset zachd
- push hout
- call WriteConsoleA
- ;czytanie dd
- push 0
- push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
- push rbuf ; rozmiar bufora
- push OFFSET bufor ;wskażnik na bufor
- push hin
- call ReadConsoleA
- lea EBX,bufor
- mov EDI,rinp
- mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
- ;--- przekształcenie D
- push OFFSET bufor
- call ScanBin
- mov zdd, AL
- mov AL, zcc
- OR zbb, AL
- mov AL, zbb
- AND zaa, AL
- mov AL, zdd
- XOR zaa, AL
- mov AL, zaa
- mov ecx,8
- mov edi,OFFSET buforBin
- L1: shl al,1
- mov BYTE PTR [edi],'0' ;wstawiamy do bufora kod ASCII 0
- jnc L2 ;jump if not carry - jeżeli cf=0 to skok do etykiety L2
- mov BYTE PTR [edi],'1' ;gdy cf=1 wstawiamy jednak do bufora kod 1
- L2: inc edi
- loop L1 ;od ecx odejmujemy 1, jeżeli nie 0 to skok do etykiety L1
- push 0 ; rezerwa, musi być zero
- push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
- push 8 ; liczba znaków a nasz rejestr 8 bitowy
- push OFFSET buforBin ; wskaźnik na tekst w buforze
- push hout ; deskryptor buforu konsoli
- call WriteConsoleA ; wywołanie funkcji WriteConsoleA
- push 0
- call ExitProcess
- main endp
- ;funkcja atoi
- atoi proc uses esi edx inputBuffAddr:DWORD
- mov esi, inputBuffAddr
- xor edx, edx
- xor EAX, EAX
- mov AL, BYTE PTR [esi]
- cmp eax, 2dh
- je parseNegative
- .Repeat
- lodsb
- .Break .if !eax
- imul edx, edx, 10
- sub eax, "0"
- add edx, eax
- .Until 0
- mov EAX, EDX
- jmp endatoi
- parseNegative:
- inc esi
- .Repeat
- lodsb
- .Break .if !eax
- imul edx, edx, 10
- sub eax, "0"
- add edx, eax
- .Until 0
- xor EAX,EAX
- sub EAX, EDX
- jmp endatoi
- endatoi:
- ret
- atoi endp
- ScanBin PROC
- ;; funkcja ScanInt przekształca ciąg cyfr dziesiętnych do liczby, którą jest zwracana przez EAX
- ;; argument - zakończony zerem wiersz z cyframi
- ;--- początek funkcji
- push EBP
- mov EBP, ESP ; wskaźnik stosu ESP przypisujemy do EBP
- ;--- odkładanie na stos
- push EBX
- push ECX
- push EDX
- push ESI
- push EDI
- ;--- przygotowywanie cyklu
- mov EBX, [EBP+8]
- push EBX
- call lstrlenA
- mov EDI, EAX ;liczba znaków
- mov ECX, EAX ;liczba powtórzeń = liczba znaków
- xor ESI, ESI ; wyzerowanie ESI
- xor EDX, EDX ; wyzerowanie EDX
- xor EAX, EAX ; wyzerowanie EAX
- mov EBX, [EBP+8] ; adres tekstu
- ;--- cykl --------------------------
- pocz:
- cmp BYTE PTR [EBX+ESI], 0h ;porównanie z kodem \0
- jne @F
- jmp et4
- @@:
- cmp BYTE PTR [EBX+ESI], 0Dh ;porównanie z kodem CR
- jne @F
- jmp et4
- @@:
- cmp BYTE PTR [EBX+ESI], 0Ah ;porównanie z kodem LF
- jne @F
- jmp et4
- @@:
- cmp BYTE PTR [EBX+ESI], 02Dh ;porównanie z kodem -
- jne @F
- mov EDX, 1
- jmp nast
- @@:
- cmp BYTE PTR [EBX+ESI], 030h ;porównanie z kodem 0
- jae @F
- jmp nast
- @@:
- cmp BYTE PTR [EBX+ESI], 031h ;porównanie z kodem 9
- jbe @F
- jmp nast
- ;----
- @@:
- push EDX ; do EDX procesor może zapisać wynik mnożenia
- mov EDI, 2
- mul EDI ;mnożenie EAX * EDI
- mov EDI, EAX ; tymczasowo z EAX do EDI
- xor EAX, EAX ;zerowani EAX
- mov AL, BYTE PTR [EBX+ESI]
- sub AL, 030h ; korekta: cyfra = kod znaku - kod 0
- add EAX, EDI ; dodanie cyfry
- pop EDX
- nast:
- inc ESI
- loop pocz
- ;--- wynik
- or EDX, EDX ;analiza znacznika EDX
- jz @F
- neg EAX
- @@:
- et4:;--- zdejmowanie ze stosu
- pop EDI
- pop ESI
- pop EDX
- pop ECX
- pop EBX
- ;--- powrót
- mov ESP, EBP ; przywracamy wskaźnik stosu ESP
- pop EBP
- ret 4
- ScanBin ENDP
- _TEXT ENDS
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement