; CIS-261
; M08demo.ASM
; @topic W080101 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>, range -128 to 127 validation
;
.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
; Literal strings for communication with the user
PROMPT_FIRST_NUMBER BYTE "Enter a number in range -128 to 127: ", 0
PROMPT_SECOND_NUMBER BYTE "Enter another number in range 0 to 255: ", 0
PROMPT_BAD_INPUT BYTE "** Bad input format, please retry...", 0
PROMPT_BAD_SMALL_NUMBER BYTE "** Error: the number is too small...", 0
PROMPT_BAD_BIG_NUMBER BYTE "** Error: the number is too big...", 0
PROMPT_BAD_SUM BYTE "** Error: sum overflow...", 0
ENDL BYTE 13, 10, 0
.STACK 100h ; (default is 1-kilobyte stack)
.DATA ; Begin initialized data segment
buffer BYTE 12 DUP (?) ; a memeory buffer for input/output
fst_8bit BYTE ? ; a memory for a byte-size variable
snd_8bit BYTE ? ; another byte-size variable
.CODE ; Begin code segment
_main PROC ; Beginning of code
;-----------------------------------------------
; Input first number from the user
;-----------------------------------------------
enter_first_number:
@@:
output PROMPT_FIRST_NUMBER ; prompt the user
input buffer, 6 ; input first integer
atod buffer ; convert to number, result in EAX
jno @F ; if no bad format detected, go on
output PROMPT_BAD_INPUT ; display error message
output ENDL ; print new line
jmp @B ; let them retry
@@:
; This is a validation code that works with signed numbers
;-----------------------------------------------
; check if the number is in range -128 to 127
;-----------------------------------------------
cmp EAX, -128 ; if EAX < -128 then bad input
jge @F ; continue if not
output PROMPT_BAD_SMALL_NUMBER ; display error message
output ENDL ; print new line
jmp enter_first_number ; let them retry
@@:
cmp EAX, 127 ; if EAX > 127 then bad input
jle @F ; continue if not
output PROMPT_BAD_BIG_NUMBER ; display error message
output ENDL ; print new line
jmp enter_first_number ; let them retry
@@:
;-----------------------------------------------
; First 8-bit number is okay
;-----------------------------------------------
mov [fst_8bit], AL ; store value in memory
;-----------------------------------------------
; Input another number from the user
;-----------------------------------------------
@@:
output PROMPT_SECOND_NUMBER ; prompt the user
input buffer, 6 ; input another integer
atod buffer ; convert to number, result in EAX
jno @F ; if no bad format detected, go on
output PROMPT_BAD_INPUT ; display error message
output ENDL ; print new line
jmp @B ; let them retry
@@:
and EAX, 000000FFh ; zero out everything except AL
mov [snd_8bit], AL ; store second number in memory
add AL, [fst_8bit] ; compute the sum
; NOTE:
; if adding signed numbers, the Overflow is indicated by OF
; if adding unsigned numbers, the Overflow is indicated by CF
jnc @F ; if no overflow adding unsigned, go on
output PROMPT_BAD_SUM ; display error message
output ENDL ; print new line
jmp enter_first_number ; let them retry
@@:
; Display the sum
dtoa buffer, EAX ; convert EAX to text
output buffer ; diplay text
output ENDL ; print new line
ret ; exit program
_main ENDP
END _main ; Marks the end of the module and sets the program entry point label