; CIS-261
; M08.ASM
; @topic W080110 IO.H and IO.ASM usage demo
; @brief Lab M08, <a href="http:;www.c-jump.com/bcc/c261c/MLabs/M08console/M08console.html" target="_blank">Console Input/Output</a>, validate range 0 to 255
.386 ; Tells MASM to use Intel 80386 instruction set.
.MODEL FLAT ; Flat memory model
option casemap:none ; Treat labels as case-sensitive
INCLUDE IO.H ; header file for input/output
.CONST ; Constant data segment
SZ_PROMPT_8BIT_UNSIGNED BYTE "Input 8-bit unsigned integer: ", 0
SZ_PROMPT_BAD_INPUT BYTE "***BAD INPUT*** try again!", 0
SZ_RESULT BYTE "The result is: ", 0
SZ_NEW_LINE BYTE 13, 10, 0
SZ_PAUSE BYTE "Please type x and hit Enter to exit: ", 0
.DATA ; Begin initialized data segment
buffer BYTE 12 DUP (?)
dtoa_buffer BYTE 11 DUP (?)
atoa_buffer BYTE 6 DUP (?)
.CODE ; Begin code segment
_main PROC ; Beginning of code
input_first_8_bit:
;--------------------------------------------------------
; Input first 8-bit unsigned integers from the user
;--------------------------------------------------------
output SZ_PROMPT_8BIT_UNSIGNED
input buffer, SIZEOF buffer ; Get user input
;--------------------------------------------------------
; Validate input length and make sure it's 0 < input < 4
;--------------------------------------------------------
szlen buffer ; Get input size in EAX
or EAX, EAX ; Is EAX zero?
jnz @F ; if not, then move on
output SZ_PROMPT_BAD_INPUT
output SZ_NEW_LINE
jmp input_first_8_bit ; repeat the input
@@:
cmp EAX, 3 ; Make sure no more than 3 characters
jle @F ; if everything okay move on
output SZ_PROMPT_BAD_INPUT
output SZ_NEW_LINE
jmp input_first_8_bit ; repeat the input
@@:
;--------------------------------------------------------
; Validate range from 0 to 255
;--------------------------------------------------------
atod buffer ; convert text to number in EAX
jno @F ; if it worked, then move on
output SZ_PROMPT_BAD_INPUT
output SZ_NEW_LINE
jmp input_first_8_bit ; repeat the input
@@:
;--------------------------------------------------------
; Now EAX contains our first number
;--------------------------------------------------------
cmp EAX, 0 ; See if EAX >= 0
jge @F ; EAX is >= 0, which is good
output SZ_PROMPT_BAD_INPUT
output SZ_NEW_LINE
jmp input_first_8_bit ; repeat the input
@@:
cmp EAX, 255 ; See if EAX > 255
jle @F ; EAX <= 255, which is good
output SZ_PROMPT_BAD_INPUT
output SZ_NEW_LINE
jmp input_first_8_bit ; repeat the input
@@:
;--------------------------------------------------------
; TODO:
;--------------------------------------------------------
; Input second 8-bit unsigned integers from the user
; Validate range from 0 to 255
; Calculate the sum of the two numbers
; Check for the overflow; if yes, repeat the input
;--------------------------------------------------------
; Print result in EAX on the screen
;--------------------------------------------------------
dtoa dtoa_buffer, EAX
output SZ_RESULT
output dtoa_buffer
output SZ_NEW_LINE
;--------------------------------------------------------
; Pause before exiting
;--------------------------------------------------------
output SZ_PAUSE
input buffer, SIZEOF buffer
ret
_main ENDP
END _main ; Marks the end of the module and sets the program entry point label