; Title: CISS 360 Demo Program 
;------------------------------------------------------------
; Description: This program determines whether or not a given
;              string is a palindrome.
;------------------------------------------------------------
; Programmer: Ron Hart
;------------------------------------------------------------
; Date/Time: Sunday, January 25, 2011 4:05 PM
;------------------------------------------------------------
.586
.MODEL FLAT
INCLUDE console_io.h  ; header file for console input/output
.STACK 4096   ; reserve 4096-byte (1024 DWORD) stack
;------------------------------------------------------------
;                   Input/Output Facility                    
;------------------------------------------------------------
; Macro     Operand
;
; put_ch    DWORD/Reg     (Displays character in parameter)
; get_ch    None          (Loads character from keyboard into EAX)
; put_str   BYTE          (Displays string beginning at given address)
; put_i     DWORD/Reg     (Displays integer value in parameter)
; put_fp    REAL4/Reg     (Displays float value in parameter)
; get_i     DWORD         (Loads integer entered at keyboard into parameter)
; get_fp    REAL4         (Loads float entered at keyboard into parameter)
; get_str   BYTE          (Loads string entered at keyboard into parameter)
;------------------------------------------------------------
.DATA   ;****************************************************
;*                  Data Section                    *
;****************************************************
prompt       BYTE   "Enter a string: ", 0
input_str    BYTE   256   DUP(0)
palin_yes    BYTE   "Input string is a palindrome",0
palin_no     BYTE   "Input string is not a palindrome",0
no_input_str BYTE   "String not entered",0
one_byte_str BYTE   "String has only one byte",0
newline   DWORD  10
.CODE   ;****************************************************
;*                  Code Section                    *
;****************************************************
_MainProc PROC
put_str   prompt             ; prompt user for input string
get_str   input_str          ; get the string
put_ch    newline            ; line space on display
mov       ecx, 0             ; byte counter
lea       edi, input_str     ; store starting address of string
;; loop to count characters in string and to get address of last byte
loop_it:  
cmp BYTE PTR [edi], 0        ; string terminator?
je        stop_scan          ; yes, end of scan
inc       ecx                ; count character
inc       edi                ; point at next character of string
jmp       loop_it            ; go check the next character
stop_scan:
cmp       ecx, 0             ; bytes in input string?
je        no_input           ; no, go display appropriate message
cmp       ecx, 1             ; yes, only one byte?
je        one_byte           ; yes, go display appropriate message 
lea       esi, input_str     ; no, determine if input string is a palindrome
dec       edi                ; backup last address
next_bytes:
cmp       esi, edi           ; start address >= ending address?
jge       yes_palin          ; yes, input string is palindrome
mov       bl, BYTE PTR [edi] ; set up to compare characters
cmp       BYTE PTR [esi], bl ; characters equal?
jne       no_palin           ; no, not a palindrome
inc       esi                ; increment to point at next byte
dec       edi                ; decrement to point at preceding byte
jmp       next_bytes         ; go check next two bytes
yes_palin:
put_str   palin_yes          ; display input string is a palindrome
jmp       main_done          ; go finish program
no_palin:
put_str   palin_no           ; display input string is not a palindrome
jmp       main_done          ; go finish program
no_input:
put_str   no_input_str       ; tell user no string was input
jmp       main_done          ; go finish program
one_byte:
put_str   one_byte_str       ; tell user a one-character string was input
main_done:
put_ch    newline            ; display newline... 
put_ch    newline            ;    and another
done                         ; display "completion" message
xor       eax, eax          ; exit with return code 0
ret
_MainProc ENDP
;------------------------------------------------------------
END  ; end of source code
 
 
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.