; 32-bit Console I/O routines .386 .model flat, stdcall option casemap :none ; case sensitive StdOut PROTO :DWORD StdIn PROTO :DWORD,:DWORD CR equ 13 LF equ 10 BS equ 8 .data Char db 4 dup(0) Buffer db 30 dup(0) Integer dd ? Ten dd 10 DigitErr db 'Error - Input not digit', CR, LF, 0 SizeErr db 'Error - Too many digits', CR, LF, 0 CRLF db CR, LF, 0 .code GetInt proto GetInt proc Near PushAD PushFD Mov Integer, 1 Push LENGTHOF Buffer Push Offset Buffer Call StdIn Mov eSi, Offset Buffer Mov eCx, 0 while5: Cld Cmp eSi, Offset Buffer + LENGTHOF Buffer Jb and5 Jmp endwhile5 and5: Mov eAx, 0 Lodsb Cmp Al, CR Jne do5 Jmp endwhile5 do5: switch1: Cmp Al, '-' Je case3 Cmp Al, '+' Je case4 Cmp Al, '0' Jb case5 Cmp Al, '9' Ja case5 Jmp case6 case3: Mov Integer, -1 case4: if8: Cmp eSi, offset Buffer + 1 ;First character position Je then8 Jmp endif8 then8: Jmp endswitch1 endif8: case5: Push offset DigitErr call StdOut Mov Integer, 1 Push LENGTHOF Buffer Push Offset Buffer Call StdIn Mov eSi, Offset Buffer Mov eCx, 0 Jmp endswitch1 case6: Sub Al, '0' Xchg eAx, eCx Mul Ten if7: Jo then7 Jmp else7 then7: Push offset SizeErr Call PutStr Mov Integer, 1 Push LENGTHOF Buffer Push Offset Buffer Call StdIn Mov eSi, Offset Buffer Mov eCx, 0 Jmp endif7 else7: Add eCx, eAx endif7: endswitch1: Jmp while5 endwhile5: Mov eAx, eCx Imul Integer Mov Integer, eAx PopFD PopAD Mov eAx, Integer ret GetInt endp NewLine proto NewLine proc Near PushFD Push offset CRLF call PutStr Add eSp, 4 PopFD ret NewLine endp PutChar proto PutChar proc Near PushAD PushFD Mov Char, Al Push offset Char call StdOut PopFD PopAD ret PutChar endp PutStr proto PutStr proc Near push eBp Mov eBp, eSp PushAD PushFD Push [eBp+8] call StdOut PopFD PopAD pop eBp ret PutStr endp PutStrng proto PutStrng proc Near PushAD PushFD Mov Al, [eDi+eCx] Mov byte ptr [eDi+eCx],0 Push eAx Push eCx Push eDi call PutStr Pop eDi Pop eCx Pop eAx Mov [eDi+eCx], Al PopFD PopAD ret PutStrng endp GetStr proto GetStr proc Near push eBp Mov eBp, eSp PushAD PushFD Push [eBp+8] Push [eBp+12] Call StdIn PopFD PopAD pop eBp ret GetStr endp PutDec proto PutDec proc Near Push eAx Call PutInt Pop eAx ret PutDec endp PutInt proto PutInt proc Near push eBp Mov eBp, eSp PushAD PushFD Mov eAx, [eBp+8] if0: Cmp eAx, 0 Jl then0 Jmp endif0 then0:Mov Al, '-' Call PutChar Mov eAx, [eBp+8] Neg eAx endif0: Mov eCx, 0 Mov eBx, 10 do0: Mov eDx, 0 Div eBx Add eDx, '0' Push eDx Inc eCx Cmp eAx, 0 Jne do0 endwhile0: do1: Pop eAx Call PutChar loop do1 endwhile1: PopFD PopAD Pop eBp ret PutInt endp GetDec proto GetDec proc Near Call GetInt ret GetDec endp end