Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extrn GetStdHandle: proc,
- WriteConsoleA: proc,
- ReadConsoleA: proc,
- lstrlenA: proc,
- ExitProcess: proc
- .data
- STACKALLOC macro arg
- push R15
- mov R15, RSP
- sub RSP, 8 * 4
- if arg
- sub RSP, 8 * arg
- endif
- and SPL, 0F0h
- endm
- STACKFREE macro
- mov RSP, R15
- pop R15
- endm
- NULL_FIFTH_ARG macro
- mov qword ptr[RSP + 20h], 0
- endm
- STD_OUTPUT_HANDLE equ -11
- STD_INPUT_HANDLE equ -10
- hStdInput dq 0
- hStdOutput dq 0
- sum dq 0
- aOutputHandle db 'a = ', 0
- bOutputHandle db 'b = ', 0
- sumOutputHandle db 'a + b = ', 0
- invalid db 'Invalid character', 0
- continue db 'Press any key to exit...', 0
- .code
- Start proc
- STACKALLOC 1
- mov RCX, STD_OUTPUT_HANDLE
- call GetStdHandle
- mov hStdOutput, RAX
- mov RCX, STD_INPUT_HANDLE
- call GetStdHandle
- mov hStdInput, RAX
- lea RAX, aOutputHandle
- push RAX
- call StringWrite
- call StringRead
- cmp R10, 0
- je invalidCharacter
- mov R8, RAX
- lea RAX, bOutputHandle
- push RAX
- call StringWrite
- call StringRead
- cmp R10, 0
- je invalidCharacter
- add R8, RAX
- lea RAX, sumOutputHandle
- push RAX
- call StringWrite
- mov RAX, R8
- push RAX
- call PrintSignedNumber
- lea RAX, continue
- push RAX
- call StringWrite
- call inputAwaiting
- call ExitProcess
- invalidCharacter:
- lea RAX, invalid
- push RAX
- call StringWrite
- lea RAX, continue
- push RAX
- call StringWrite
- call ExitProcess
- Start endp
- StringWrite proc uses RAX RCX RDX R8 R9 R10 R11, string: qword
- local bytesWritten: qword
- STACKALLOC 1
- mov RCX, string
- call lstrlenA
- mov RCX, hStdOutput
- mov RDX, string
- mov R8, RAX
- lea R9, bytesWritten
- NULL_FIFTH_ARG
- call WriteConsoleA
- STACKFREE
- ret 8
- StringWrite endp
- StringRead proc uses RBX RCX RDX R8 R9 R10 R11
- local readStr[64]: byte,
- bytesRead: dword
- STACKALLOC 1
- mov RCX, hStdInput
- lea RDX, readStr
- mov R8, 64
- lea R9, bytesRead
- NULL_FIFTH_ARG
- call ReadConsoleA
- xor RCX, RCX
- mov ECX, bytesRead
- sub ECX, 2
- mov readStr[RCX], 0
- xor RBX, RBX
- mov R8, 1
- strReading:
- dec RCX
- cmp RCX, -1
- je scanningComplete
- mov RAX, 0
- mov AL, readStr[RCX]
- cmp AL, '-'
- jne eval
- neg RBX
- jmp scanningComplete
- eval:
- cmp AL, 30h
- jl error
- cmp AL, 39h
- jg error
- add RBX, RAX
- sub RAX, 30h
- mul R8
- add RBX, RAX
- mov RAX, 10
- mul R8
- mov R8, RAX
- error:
- xor R10, R10
- STACKFREE
- ret
- scanningComplete:
- mov R10, 1
- mov RAX, RBX
- STACKFREE
- ret
- StringRead endp
- PrintSignedNumber proc uses RAX RCX RDX R8 R9 R10 R11, number: qword
- local numberStr[22]: byte
- xor R8, R8
- mov RAX, sum
- btc number, 63
- inc R8
- neg RAX
- mov RBX, 10
- xor RCX, RCX
- digitDivision:
- xor RDX, RDX
- div RBX
- add RDX, '0'
- push RDX
- inc RCX
- cmp RAX, 0
- jne digitDivision
- jmp prohodPoStacky
- prohodPoStacky:
- pop RDX
- mov numberStr[R8], DL
- inc R8
- cmp RCX, 0
- jne prohodPoStacky
- mov numberStr[R8], 0
- lea RAX, numberStr
- push RAX
- ret 8
- PrintSignedNumber endp
- inputAwaiting proc uses RAX RCX RDX R8 R9 R10 R11
- local readStr: byte,
- bytesRead: dword
- STACKALLOC 1
- lea RCX, continue
- call lstrlenA
- mov RCX, hStdOutput
- lea RDX, continue
- mov R8, RAX
- lea R9, bytesRead
- NULL_FIFTH_ARG
- call WriteConsoleA
- mov RCX, hStdInput
- lea RDX, readStr
- mov R8, 1
- lea R9, bytesRead
- NULL_FIFTH_ARG
- call ReadConsoleA
- STACKFREE
- ret
- inputAwaiting endp
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement